2017-06-10 4 views
1

私は最近、約5年間この言語に触れていないので、実際に基本的なErlang開発を始めました。すべての項目をそれぞれの行に出力する

私の機能は私の再帰で無限ループに思わなぜ私は悩みの理解を持っている:

-module(list_tut). 
-export([print_cities/1]). 
-author("kimput"). 

print_cities([]) -> 
    ok; 

print_cities([H|T]) -> 
    io:format('city: ~p~n', [H]), 
    [H|print_cities([T])]. 

私は次のように都市のリストを入力した場合:

> list_tut:print_cities(['Moscow', 'Tokyo', 'Stockholm']).

それはすべて印刷します項目を速くしてから印刷を続行しますcities: []

私はこれが絶対初心者の質問だと理解していますが、私は長い間この問題を見てきましたが、テール再帰やそれに類するものを追加することなく解決する方法を見つけることはできません...

アドバイスは非常に気に入られるでしょう! :)

答えて

2

これは、の代わりに[T]で再帰しているためです。 Tは既にリストであるリストの末尾です(リストが不適切なリストでない場合)。あなたのコードは、無限再帰に加えて意味別のリスト、中尾をラップされたプリント初期の要素も間違っている:

-module(list_tut). 
-export([print_cities/1]). 
-author("kimput"). 

print_cities([]) -> 
    ok; 

print_cities([H|T]) -> 
    io:format('city: ~p~n', [H]), 
    [H|print_cities(T)]. 
1> c(list_tut). 
{ok,list_tut} 
2> list_tut:print_cities(['Moscow', 'Tokyo', 'Stockholm']). 
city: 'Moscow' 
city: 'Tokyo' 
city: 'Stockholm' 
['Moscow','Tokyo','Stockholm'|ok] 

1> c(list_tut). 
{ok,list_tut} 
2> list_tut:print_cities(['Moscow', 'Tokyo', 'Stockholm']). 
city: 'Moscow' 
city: ['Tokyo','Stockholm'] 
city: [] 
city: [] 
city: [] 
city: [] 
city: [] 
... 

[H|print_cities([T])].[H|print_cities(T)].に修正これを変更します


印刷機能でリストを再作成する理由はわかりませんが、元のリストb ackの場合、[]ケースは、最終戻り値を最初の値と同じにする場合は[]を返します。

... 
print_cities([]) -> 
    []; 
... 
1> c(list_tut). 
{ok,list_tut} 
2> list_tut:print_cities(['Moscow', 'Tokyo', 'Stockholm']). 
city: 'Moscow' 
city: 'Tokyo' 
city: 'Stockholm' 
['Moscow','Tokyo','Stockholm'] 
+0

感謝の男!私はそれがコードのどこかで小さな間違いだったと確信していました。神様、今私は恥ずかしいと感じます。:P – geostocker

関連する問題