递归循环中的值

时间:2011-02-01 10:33:14

标签: erlang

在递归循环中,我想更改变量的值:

loop(N) when N > ... ->
N;
loop(N) ->
case ... of
  N+1
  ...
end,
...
case ... of
  N-1
  ...
end,
...
loop(N).

如何“传递”N的新值?

2 个答案:

答案 0 :(得分:5)

由于您在分配后无法更改N的值,因此您需要使用新值调用loop

loop(N) ->
    loop(N+1).

或者,创建一个临时变量来保存其新值,然后再将其传递给递归loop调用。

loop(N) ->
    NewN = N+1,
    loop(NewN).

如果这导致代码中出现大量重复,您可能希望将循环结构与产生新值N的逻辑分开:

loop(N) ->
    NewN = logic(N),
    loop(NewN).

logic(N) ->
    N+1.

答案 1 :(得分:4)

您只需使用新值调用该函数:

$ cat fac.erl
-module(fac).
-export([fac/1]).

fac(0) -> 1;
fac(N) when N > 0 -> N*fac(N-1).

$ erl
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:8:8] [rq:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> c(fac).
{ok,fac}
2> fac:fac(10).
3628800
3> q().
ok
4> $

无耻地被盗:http://learnyousomeerlang.com/recursion#hello-recursion