首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Erlang中编写递归的趣事?

如何在Erlang中编写递归的趣事?
EN

Stack Overflow用户
提问于 2009-05-15 07:35:43
回答 5查看 10.5K关注 0票数 38

我试图在Erlang shell中编写一个递归有趣的代码,但我总是得到一个未绑定的变量异常:

代码语言:javascript
复制
1> Foo = fun(X) -> Foo(X) end.
* 1: variable 'Foo' is unbound

这可能是不言而喻的,但我并不是要创建一个无限循环!这只是我得到的错误的一个简单示例。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-05-15 08:12:31

OTP 17.0以来,有命名的funs:

代码语言:javascript
复制
1> Perms = fun F([]) -> [[]]; F(L) -> [[H|T] || H <- L, T <- F(L--[H])] end.    
#Fun<erl_eval.30.54118792>
2> Perms([a,b,c]).
[[a,b,c],[a,c,b],[b,a,c],[b,c,a],[c,a,b],[c,b,a]]

在此之前,您可以使用一个小参数技巧来完成此操作:

代码语言:javascript
复制
1> Foo = fun(F, X) -> F(F, X) end.
#Fun<erl_eval.12.113037538>
2> Foo(Foo, a).
<...infinite loop!>

这里的诀窍是将函数作为参数发送给自身,以允许递归。

另一种方法是在一次拍摄中完成:

代码语言:javascript
复制
1> Foo = fun(X) -> Fun = fun(F,Y) -> F(F,Y) end, Fun(Fun,X) end.
#Fun<erl_eval.6.13229925>
2> Foo(a).

例如:

代码语言:javascript
复制
1> Foo = fun(Max) ->
1>     Fun = fun(F, X) when X > Max -> [];
1>              (F, X) -> [X | F(F, X+1)]
1>           end,
1>     Fun(Fun, 0)
1> end.
#Fun<erl_eval.6.13229925>
2> Foo(10).
[0,1,2,3,4,5,6,7,8,9,10]
票数 53
EN

Stack Overflow用户

发布于 2014-05-02 16:14:03

在Erlang 17之后,您还可以使用"Funs with names"变体:

代码语言:javascript
复制
Foo = fun F(X) -> F(X) end.

这样就更容易理解F是定义中的函数本身。此外,FooF可以是同一个变量。

票数 22
EN

Stack Overflow用户

发布于 2009-05-15 12:47:47

或者,您可以使用Y组合器。Y Combinator in Erlang解释道。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/867418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档