如何在 Erlang 中编写这些嵌套的 for 循环
How to write these nested for-loops in Erlang
我想在 Erlang 中实现这个伪代码:
function()
B[1] <-- 1
for m <-- 2 to 21 do
B[m] <-- 0
for k <-- 1 to m - 1 do
B[m] <-- B[m] − 9 * B[k]
B[m] <-- B[m]/m
return B
我的第一个想法是用列表理解来做一些事情,比如
[...|| M <- lists:seq(2,21), K <- lists:seq(1,M-1)]
为了尝试以某种方式“翻译”嵌套的 for 循环,但现在我卡住了,我不知道如何继续。
我非常感谢有关如何用 Erlang 编写这段代码的帮助,我感到有点迷茫。
提前致谢!
代码可能是这样的:
test_loop2()->
M = lists:seq(2,21),
Dict = dict:new(),
Dict_a = dict:store(1,1,Dict),
Dict_b = lists:foldl(fun(X,Acc_x)->
io:format("x:~p~n",[X]),
Value = lists:foldl(fun(A,Acc_a)->
Acc_a - 9*A
end,0,lists:seq(1,X-1)),
dict:store(X,Value,Acc_x)
end,Dict_a,M),
io:format("~p",[lists:sort(dict:to_list(Dict_b))]).
在erlang中,一个for-loop是这样写的:
loop(StopIndex, StopIndex) -> ok;
loop(CurrentIndex, StopIndex) ->
%% do stuff
loop(CurrentIndex+1, StopIndex).
嵌套循环如下所示:
outer_loop(StopIndex, StopIndex) -> ok;
outer_loop(Index, StopIndex) ->
io:format("---->outer_loop index: ~w~n", [Index]),
inner_loop(1, Index-1),
outer_loop(Index+1, StopIndex).
inner_loop(StopIndex, StopIndex) ->
io:format("inner_loop index: ~w~n", [StopIndex]);
inner_loop(Index, StopIndex) ->
io:format("inner_loop index: ~w~n", [Index]),
inner_loop(Index+1, StopIndex).
在shell中:
12> a:outer_loop(2, 7).
---->outer_loop index: 2
inner_loop index: 1
---->outer_loop index: 3
inner_loop index: 1
inner_loop index: 2
---->outer_loop index: 4
inner_loop index: 1
inner_loop index: 2
inner_loop index: 3
---->outer_loop index: 5
inner_loop index: 1
inner_loop index: 2
inner_loop index: 3
inner_loop index: 4
---->outer_loop index: 6
inner_loop index: 1
inner_loop index: 2
inner_loop index: 3
inner_loop index: 4
inner_loop index: 5
ok
如果你需要在循环中操作一些数据,那么你可以在函数定义中添加其他参数变量来保存数据。例如,在您的示例中,内部循环需要一个变量来存储数据结构 B.
最后,您应该知道列表在随机访问时很糟糕,例如B[m],所以考虑使用array模块。
我想在 Erlang 中实现这个伪代码:
function()
B[1] <-- 1
for m <-- 2 to 21 do
B[m] <-- 0
for k <-- 1 to m - 1 do
B[m] <-- B[m] − 9 * B[k]
B[m] <-- B[m]/m
return B
我的第一个想法是用列表理解来做一些事情,比如
[...|| M <- lists:seq(2,21), K <- lists:seq(1,M-1)]
为了尝试以某种方式“翻译”嵌套的 for 循环,但现在我卡住了,我不知道如何继续。
我非常感谢有关如何用 Erlang 编写这段代码的帮助,我感到有点迷茫。
提前致谢!
代码可能是这样的:
test_loop2()->
M = lists:seq(2,21),
Dict = dict:new(),
Dict_a = dict:store(1,1,Dict),
Dict_b = lists:foldl(fun(X,Acc_x)->
io:format("x:~p~n",[X]),
Value = lists:foldl(fun(A,Acc_a)->
Acc_a - 9*A
end,0,lists:seq(1,X-1)),
dict:store(X,Value,Acc_x)
end,Dict_a,M),
io:format("~p",[lists:sort(dict:to_list(Dict_b))]).
在erlang中,一个for-loop是这样写的:
loop(StopIndex, StopIndex) -> ok;
loop(CurrentIndex, StopIndex) ->
%% do stuff
loop(CurrentIndex+1, StopIndex).
嵌套循环如下所示:
outer_loop(StopIndex, StopIndex) -> ok;
outer_loop(Index, StopIndex) ->
io:format("---->outer_loop index: ~w~n", [Index]),
inner_loop(1, Index-1),
outer_loop(Index+1, StopIndex).
inner_loop(StopIndex, StopIndex) ->
io:format("inner_loop index: ~w~n", [StopIndex]);
inner_loop(Index, StopIndex) ->
io:format("inner_loop index: ~w~n", [Index]),
inner_loop(Index+1, StopIndex).
在shell中:
12> a:outer_loop(2, 7).
---->outer_loop index: 2
inner_loop index: 1
---->outer_loop index: 3
inner_loop index: 1
inner_loop index: 2
---->outer_loop index: 4
inner_loop index: 1
inner_loop index: 2
inner_loop index: 3
---->outer_loop index: 5
inner_loop index: 1
inner_loop index: 2
inner_loop index: 3
inner_loop index: 4
---->outer_loop index: 6
inner_loop index: 1
inner_loop index: 2
inner_loop index: 3
inner_loop index: 4
inner_loop index: 5
ok
如果你需要在循环中操作一些数据,那么你可以在函数定义中添加其他参数变量来保存数据。例如,在您的示例中,内部循环需要一个变量来存储数据结构 B.
最后,您应该知道列表在随机访问时很糟糕,例如B[m],所以考虑使用array模块。