如何在 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模块。