簡體   English   中英

河內二郎塔

[英]Erlang Towers of Hanoi

目前停留在嘗試使用集合來實現河內的塔樓。 我正在嘗試使用Java使用堆棧http://www.sanfoundry.com/java-program-implement-solve-tower-of-hanoi-using-stacks/的示例,但是我正在理解

-module(toh).
-export([begin/0]).
begin() -> 
  Pegs = 3,
  TowerA = createTowerA(N),
  TowerB = [],
  TowerC = [],
  move(Pegs, TowerA, TowerB, TowerC).

%fills Tower A with integers from Pegs to 1.
createTowerA(0) -> [];
createTowerA(N) when N > 0 ->
   [N] ++ createTowerA(N - 1).

%displays the towers
display(A, B, C) -> 
   io:format("~w\t~w\t~w~n", [A, B, C]).

move(Pegs, TowerA, TowerB, TowerC) -> 
  if Pegs > 0 ->
    move(Pegs, TowerA, TowerC, TowerB),
    Temp = lists:last(TowerA),
    NewTowerC = C ++ Temp,
    NewTowerA = lists:sublist(TowerA, length(TowerA) - 1),
    display(NewTowerA, B, NewTowerC),
    move(Pegs - 1, B, NewTowerA, NewTowerC);
  end

當我嘗試運行代碼時,出現此錯誤。

{"init terminating in do_boot",{undef,[{toh,begin,[],[]},{init,begin_i
t,1,[{file,"init.erl"},{line,1057}]},{init,begin_em,1,[{file,"init.erl"},{line,1
037}]}]}}

Crash dump was written to: erl_crash.dump
init terminating in do_boot ()

有人可以看到為什么這不起作用嗎? 我只是想效仿Sanfoundry的例子。

該代碼無法編譯,至少在使用move / 4時變量C是未綁定的。 因此,您似乎沒有在嘗試執行該文件之前對其進行了編譯。

盡管Erlang使用了虛擬機,但必須在執行之前對其進行編譯。

除此代碼中的C變量外,還有其他問題:如果在不使用任何返回值的情況下,在if的第一行中遞歸調用move / 4,則不會產生任何效果。 另外,您正在使用語法錯誤的if語句。 正確的語法是:

if
    GuardSeq1 ->
        Body1;
    ...;
    GuardSeqN ->
        BodyN    % no semicolon at the end of the last body
end

如果打算使用此功能,請注意,必須始終至少有一個為真的防護,否則代碼將崩潰。

我的版本[編輯:刪除無用的功能,更好地打印]:

-module (toh).

-export([start/1]).


start(N) ->
    Game = #{1 => lists:seq(1,N), 2 => [], 3 => []},
    display(Game,N),
    move(N,Game,1,3,N).

move(1,Game,From,To,Size) ->
    [H|NewFrom] = maps:get(From,Game),
    NewTo = [H|maps:get(To,Game)],
    NewGame = maps:update(From,NewFrom,maps:update(To,NewTo,Game)),
    display(NewGame,Size),
    NewGame;
move(N,Game,From,To,Size) ->
    Other = other(From,To),
    Game1 = move(N-1,Game,From,Other,Size),
    Game2 = move(1,Game1,From,To,Size),
    move(N-1,Game2,Other,To,Size).

display(#{1 := A, 2 := B, 3 := C},D) ->
    lists:foreach(fun(X) -> print(X,D) end,lists:zip3(complete(A,D),complete(B,D),complete(C,D))),
    io:format("~n~s~n~n",[lists:duplicate(6*D+5,$-)]).

complete(L,D) -> lists:duplicate(D-length(L),0) ++ L.

print({A,B,C},D) -> io:format("~s ~s ~s~n",[elem(A,D),elem(B,D),elem(C,D)]).

elem(I,D) -> lists:duplicate(D-I,$ ) ++ lists:duplicate(I,$_) ++ "|" ++ lists:duplicate(I,$_) ++ lists:duplicate(D-I,$ ).

other(I,J) -> 6-I-J.

在外殼中:

Eshell V6.1  (abort with ^G)
1> c(toh).
{ok,toh}
2> toh:start(3).
  _|_      |       |   
 __|__     |       |   
___|___    |       |   

-----------------------

   |       |       |   
 __|__     |       |   
___|___    |      _|_  

-----------------------

   |       |       |   
   |       |       |   
___|___  __|__    _|_  

-----------------------

   |       |       |   
   |      _|_      |   
___|___  __|__     |   

-----------------------

   |       |       |   
   |      _|_      |   
   |     __|__  ___|___

-----------------------

   |       |       |   
   |       |       |   
  _|_    __|__  ___|___

-----------------------

   |       |       |   
   |       |     __|__ 
  _|_      |    ___|___

-----------------------

   |       |      _|_  
   |       |     __|__ 
   |       |    ___|___

-----------------------

#{1 => [],2 => [],3 => [1,2,3]}
3>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM