之所以会有这种想法,基于两个理由:
递归本质上是在进行压栈操作,人脑不易理解,尽管很多人都在尝试,相比之下,循环就容易理解多了。
这有一篇文章深入地介绍了递归,http://blog.csdn.net/theknotyouknow/article/details/24435291
循环执行效率比递归高很多。
在知乎上搜了一下,感觉回答的并不是很好,还请各位不吝赐教。
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
能。大学计科有讲这个的。而且反过来也成立。
你想啊,递归调用就是把参数压栈。改成循环,我手动建个栈,每次循环把需要的数据压进去,循环完弹出来不就可以了么。
递归 vs 循环:
如果上面两个问题的答案都是yes,那么就获得了一种构造证明方法。
通过栈,所有递归都能变成循环。高级语言只是把语言级别的递归变成实现级别的栈。这个问题在网上有很详细的论文。用google搜recursion iteration会发现相当多的答案。
用栈来实现将递归变成循环并不能带来性能的优化,在同种语言的条件下比较更可能带来性能的损失。
有的递归不需要增加栈。去掉了栈和栈操作可以带来速度和空间两方面的效率提升。这其中的一类叫尾递归,有的语言实现了尾递归优化,也就是自动将尾递归变成循环同时不增加栈。比如lisp,scheme,haskell等很多语言都实现了这种优化,但是大多数动态语言包括python,javascript,ruby都没有,因此这些语言经常会报告递归函数超过最大栈深度的错误。
我正在做的一个语言,其中一个特性是在支持尾递归的优化的同时还要支持某些非尾递归的优化,将递归函数转换成不用栈的循环(当然只是一部分,因为不用栈是不可能将所有函数转换成循环的)。
比如sum = (x) -> if x=0 then return 0 else return x+f(x-1)
这个函数是非尾递归的,因为在递归调用函数之后还做了加法。
转换成尾递归是这种形式:sum = (x, acc) -> if x=0 then return acc else return f(x-1, acc)
现在的某些语言将自动把后面这种函数变成循环,同时栈不增加。也就是类似如下的代码
sum = (x, acc) -> while 1 if x=0 then return acc else acc += x
我做的语言将自动把非尾递归的版本变成如下的循环:
sum = (x) -> sum = 0; while 1 then if x=0 then return sum else x--; f += x
补充说明一点: 我这里提供的并不是伪代码,全部都是我将发布的语言中的合法代码。
不觉得递归更像数学公式么,
f(n)=f(n-1)+f(n-2)如果写成循环不见得好理解哦
理论上行。但是,代码好理解更重要
递归是一个执行速度特别慢的算法,个人建议,能用递归尽量不用递归。
比如:f(n)=f(n-1)+f(n-2)
当n=100时,程序就跑不起了,,个别说更大的了。。。
大家可以尝试
吧递归写成循环,需要把函数表达式写成
f(x)=x的多项式形式,简单的递归还行,复杂的递归化简起来相当费劲,已经超出了程序员的力所能及范畴了。PHP递归是有深度限制的