您好、欢迎来到现金彩票网!
当前位置:在线斗牛棋牌游戏 > 尾递归 >

Erlang 学习:写出正确的尾递归代码

发布时间:2019-06-12 10:23 来源:未知 编辑:admin

  你很可能常常看见这样的代码,并因为它是来自于 erlang 官方的文档 getting start with erlang 而觉得这样的代码,可能就是传说中的尾递归。

  没错,一个函数自己调用自己,这就是递归。但,这真的就是传说中可以通过编译优化得“和循环一样快,没有额外开销”的尾递归么?递归和尾递归,是否存在差异呢?

  为了速度考虑,我们稍微修改我们要递归的函数,从 f(x)=x*f(x-1) 变成 f(x)=x+f(x-1) (这叫啥数列来着,我忘了)。这么改是为了让我们不用等到胡子白就能看到效果。写成代码就是这样子的:

  呵呵,我的机器差,才到 100M 就挂了,如果你的机器好,尽管在后面多加几个 0 好了。

  其实,这个问题的实质是,这的确是递归,但不是尾递归。试问又哪有递归又不狂费内存的东西呢?所以……

  在 fac(N) 计算时,需要把 N 先保存在 stack 里面,以便 fac(N -1) 算完了可以相加,得到结果然并返回。

  可是,如果你的代码是准备运行很多次,比如说就像上面的1亿次或者更多时,这个开销就大了,于是当然就 Over 没商量了。

http://missartypants.com/weidigui/107.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有