2017-11-20 6 views
1

私はerlangをよく理解していませんし、過去数時間にわたってこれを修正する方法を探していましたが、ステートメントの例。Erlang例外エラー:if式を評価するときに真の分岐が見つかりません

私は再帰関数を使用して、あるハノイ塔から別のハノイ塔にディスクを移動しようとしています。しかし、私は "if式を評価するときに真のブランチが見つかりません"を得ます。どこかでtrue ->が必要であると分かっていますか?

-module(hanoi). 

-export([main/1]). 

%% Create Towers 
main(NumDiscs) -> 
    TowerA = create_tower(NumDiscs), 
    TowerB = [], 
    TowerC = [], 
    display_towers(TowerA,TowerB,TowerC), 
    solve(NumDiscs,TowerA,TowerB,TowerC). 

%% Add the number of discs inputted to the first tower 
create_tower(0) -> []; 

create_tower(NumDiscs) when NumDiscs > 0 -> 
    [NumDiscs] ++ create_tower(NumDiscs - 1). 

%% Display all towers 
display_towers(A,B,C) -> 
    io:format("-------------------------\n"), 
    io:format("Tower A: ~p\n",[A]), 
    io:format("Tower B: ~p\n",[B]), 
    io:format("Tower C: ~p\n",[C]). 


solve(Disc,TowA,TowB,TowC) -> 
if Disc > 0 -> 
    solve(Disc - 1,TowA,TowB,TowC), 
    TowBNew = [lists:last(TowA)], 
    TowCNew = [lists:append(TowC,TowBNew)], 
    TowANew = [lists:sublist(TowA,length(TowA) - 1)], 
    display_towers(TowANew,TowB,TowCNew), 
    solve(Disc - 1,TowANew,TowCNew,TowB) 
end. 

答えて

0

ここは長い時間前のコードです。これはあなたを助けることを願って:

main(N)-> 
    towerhanoi(N, a, b, c). 
towerhanoi(N, A, C, B)-> 
    case N of 
     1 -> 
      change(N, A, C); 
     _ -> 
      towerhanoi(N-1, A, B, C), 
      change(N, A, C), 
      towerhanoi(N-1 , B, C, A) 
    end. 
change(N, A, C)-> 
    io:format("change disc ~p from tower ~p to tower ~p~n", [N, A, C]). 
+0

感謝を:)残念ながら、私も同じエラーが出る:( –

3

アーランif式がの評価がtrueの枝を持っている必要があります。 Disc > 0がfalseのときにエラーがスローされると思います。あなたはそれにtrue ->句を追加する必要があります:返信用

solve(Disc,TowA,TowB,TowC) -> 
    if Disc > 0 -> 
    solve(Disc - 1,TowA,TowB,TowC), 
    TowBNew = [lists:last(TowA)], 
    TowCNew = [lists:append(TowC,TowBNew)], 
    TowANew = [lists:sublist(TowA,length(TowA) - 1)], 
    display_towers(TowANew,TowB,TowCNew), 
    solve(Disc - 1,TowANew,TowCNew,TowB); % <- note the ';' 
    true -> 
    % do something here 
end. 
+0

は私が本当の間に何か入れて持っていますか - >と終了を –

+0

事がある、ディスク。?私は通常テストのために3を入力するので、なぜ最初の実行でトリップしているのか分かりません –

+1

あなたの関数が最初に行うことは 'Disc-1'で自分自身を呼び出すことです.1に達すると、 – Dogbert

関連する問題