fun函数的强大用法-尾递归
来源:互联网 发布:怎样在淘宝兼职 编辑:程序博客网 时间:2024/06/07 13:57
List Comprehensions的更是强大,官方文档:http://www.erlang.org/doc/programming_examples/list_comprehensions.html另外列表解析可以在Erlang Shell中方便的实现for循环和if
但是在Erlang Shell里面怎么写尾递归呢?
1> Fun =fun(X) when X rem 2==0 ->X; (X) -> X+1 end .#Fun<erl_eval.6.13229925>2> F1 =fun(X) when X rem 2==0 ->X; (X) -> (X+1) end .#Fun<erl_eval.6.13229925>3> F1(5).64> F2 =fun(X) when X rem 2==0 ->X; (X) -> (X+7) end .#Fun<erl_eval.6.13229925>5> F2(5).12
可以看到在一个参数的时候,上面的代码是可以的,啊哈,不错,那两个参数的情况是不是正常呢?
6> F3 = fun(X,Y) when Y<1000 ->io:format("~p,",[X+Y]), (Y,X+Y); (X,Y)-> done end.
* 1: syntax error before: ','
7> F3 = fun(X,Y) when Y<1000 ->io:format("~p,",[X+Y]), (Y,X+Y); (X,Y)-> done end.
* 1: syntax error before: ','
8> F1 =fun(X,Y) when X rem2==0 ->{X,Y}; (X) -> (X+7,Y) end .
* 1: syntax error before: ','
7>
* 1: syntax error before: ','
7> F3 = fun(X,Y) when Y<1000 ->io:format("~p,",[X+Y]), (Y,X+Y); (X,Y)-> done end.
* 1: syntax error before: ','
8> F1 =fun(X,Y) when X rem2==0 ->{X,Y}; (X) -> (X+7,Y) end .
* 1: syntax error before: ','
7>
结果让人失望,会有语法错误,那没有参数的情况呢
如果要达到我们的目标,要把尾递归要执行的当前方法作为参数传进去,几番折腾,终于搞出来了:
8> F7 = fun(F,X,Y) when Y<1000 ->io:format("~p,",[X+Y]), F(F,Y,X+Y); (F,X,Y)->done end.#Fun<erl_eval.18.105910772>
马上写一个有意义的demo出来看看,输出一下斐波那契数列吧
1> Func = fun(F, X,Y) when Y<10000 ->io:format("~p,",[X+Y]), F(F,Y,X+Y); (F,X,Y)-> done end.#Fun<erl_eval.18.105910772>2> Func(Func,0,1).1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,done4>
注意实现尾递归调用的地方,以及调用的方法.
那么没有参数的情况也就水到渠成了:
12> Fn= fun(F)-> receive {echo,Msg} -> io:format("~p received.~n",[Msg]),F(F);stop-> stop end end.#Fun<erl_eval.6.13229925>13> P4=spawn(fun() -> Fn(Fn) end).<0.48.0>14> is_process_alive(P4).true15> P4!{echo,12}.12 received.{echo,12}16> P4!{echo,hello }.hello received.{echo,hello}17> is_process_alive(P4).true18>
http://stackoverflow.com/questions/867418/how-do-you-write-a-fun-thats-recursive-in-erlang/867525
- fun函数的强大用法-尾递归
- sscanf函数的用法,功能很强大
- 函数的递归和getchar()的用法
- c语言中sprintf()函数的强大用法
- 威力强大的递归查询
- 威力强大的递归查询
- Pku1579 Function Run Fun (动态规划)递归函数
- 递归函数的概念用法与实例
- 递归函数在不同情况的用法
- JAVASCRIPT里的函数递归用法
- 递归函数的用法,其中refresh()和SelectMenu()为递归
- 强大的ackermann函数
- 强大的sscanf 函数
- 强大的sscanf函数
- 强大的parseFloat函数
- 强大的sscanf函数
- 见识一下尾递归的强大!尾递归怎么会比迭代还快!这不科学
- python的递归函数--含尾递归
- Win7系统ping不懂VMWave中的虚拟机Linux
- spring+Mongodb简单整合
- HTML5 Fullscreen API html5全屏编程API
- Apache调优最详细
- Html5 表单验证和style css验证支持
- fun函数的强大用法-尾递归
- JAVA性能测试与调优案例
- 几个有用的unix命令快捷键
- Python Exercise #18
- TQ2440裸机MMU
- 如何快速是DNS修改生效
- strings和nm命令
- Linux系统性能检测
- 写快排 总结的问题