Erlang中的Collatz序列

hfyxw5xn  于 2022-12-08  发布在  Erlang
关注(0)|答案(3)|浏览(122)

我试图解决的问题如下:编写一个名为collatz的Erlang函数,该函数有一个参数N。可以假设N是一个大于或等于1的整数。该函数应打印Collatz序列(每行一个数字)。例如,collatz(4)应打印4、2、1(在单独行上)。collatz(6)应打印6、3、10、5、16、8、4、2、1(在单独行上)。
我编写的collatz函数工作正常,但是我在单独的行上打印输出时遇到了困难。下面代码中注解掉的部分是我试图在单独的行上生成输出的尝试。

collatz(1) -> [1];
    collatz(N) when N rem 2 == 0 ->
    [N|collatz(N div 2)];
    %[io:format("Collatz is : ~p~n",[N])N|collatz(N div 2)];
    collatz(N) ->
    [N|collatz(3*N+1)].
    %[io:format("Collatz is : ~p~n",[N])N|colla[N|collatz(N div 2)]tz(3*N+1)].

例如,当我调用collatz(5)时,得到的输出是[5,16,8,4,2,1],我希望这些数字在单独的行中打印出来。

j7dteeu8

j7dteeu81#

考虑在每次迭代之前打印每个元素,而不是运行整个程序并打印结果,如

collatz(N) -> io:format("~p~n", [N]), collatz(next_collatz(N)).
tct7dpnv

tct7dpnv2#

您只需要在将N添加到列表之前 * 计算io:format/2 ...

collatz(1) ->
    io:format("Collatz is : 1~n"),
    [1];
collatz(N) when N rem 2 == 0 ->
    io:format("Collatz is : ~p~n", [N]),
    [N | collatz(N div 2)];
collatz(N) ->
    io:format("Collatz is : ~p~n", [N]),
    [N | collatz(3 * N + 1)].
eiee3dmh

eiee3dmh3#

1> C = fun C(1,_) -> io:format("1~n") ;
2> % rem is not allowed in a guard, it is why I added it in the parameters                            
2> C(N,0)  -> io:format("~p~n",[N]), NN = N div 2,  C(NN, NN rem 2);
3> C(N,_) -> io:format("~p~n",[N]), NN = 3 * N + 1, C(NN, NN rem 2) end.
#Fun<erl_eval.19.97283095>
4> Collatz = fun(N) -> C(N, N rem 2) end.                               
#Fun<erl_eval.44.97283095>
5> Collatz(5).                                                          
5
16
8
4
2
1
ok
6>

相关问题