Erlang 递归循环中的值

Erlang 递归循环中的值,erlang,Erlang,在递归循环中,我想更改变量的值: loop(N) when N > ... -> N; loop(N) -> case ... of N+1 ... end, ... case ... of N-1 ... end, ... loop(N). 如何“传递”N的新值?只需使用新值调用函数: $ cat fac.erl -module(fac). -export([fac/1]). fac(0) -> 1; fac(N) when N > 0 -&g

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

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

如何“传递”N的新值?

只需使用新值调用函数:

$ 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> $
loop(N) ->
    loop(N+1).

不知羞耻地从中窃取:

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

$ 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> $
loop(N) ->
    loop(N+1).

厚颜无耻地从以下位置偷来:

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

$ 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> $
loop(N) ->
    loop(N+1).
或者,创建一个临时变量来保存其新值,然后再将其传递到递归
循环
调用中

loop(N) ->
    NewN = N+1,
    loop(NewN).
如果这导致代码中出现大量重复,则可能需要将循环构造与产生新值N的逻辑分离:

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

logic(N) ->
    N+1.

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

$ 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> $
loop(N) ->
    loop(N+1).
或者,创建一个临时变量来保存其新值,然后再将其传递到递归
循环
调用中

loop(N) ->
    NewN = N+1,
    loop(NewN).
如果这导致代码中出现大量重复,则可能需要将循环构造与产生新值N的逻辑分离:

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

logic(N) ->
    N+1.

好的,但我有一个经典的问题。我不能使用if,因为防护功能有限。我必须使用用例,但只有一个子句有兴趣。然后我有“不安全”的信息
case
是一个表达式(在Erlang中所有内容都是一个表达式),因此它返回值。您可以将其绑定到递归调用中使用的NewN。类似于
NewN=case。。。结束,循环(NewN)。
这将删除不安全的错误。好的,但我必须管理案例的第二条!B=一个->1的情况X_other->[]end我想要的是:如果X==one->B=1 end定义
B
1
当且仅当
(X==one)
并且在所有其他情况下根本不定义
B
对我来说没有意义。是的,看到你总是要使用
B
你必须给它一个值。好的,但我对这个案例有一个经典的问题。我不能使用if,因为防护功能有限。我必须使用用例,但只有一个子句有兴趣。然后我有“不安全”的信息
case
是一个表达式(在Erlang中所有内容都是一个表达式),因此它返回值。您可以将其绑定到递归调用中使用的NewN。类似于
NewN=case。。。结束,循环(NewN)。
这将删除不安全的错误。好的,但我必须管理案例的第二条!B=一个->1的情况X_other->[]end我想要的是:如果X==one->B=1 end将
B
定义为
1
当且仅当
(X==one)
并且在所有其他情况下根本不定义
B
对我来说没有意义。是的,看到你总是要使用
B
,你必须给它一个值。