主题:求教,尾递归和迭代的区别~~
larryliu
[专家分:0] 发布于 2011-10-02 21:54:00
请教一个各位高手,递归和迭代怎么区分?[em18](特别是尾部递归和迭代)最好有点小例子作解释~~
回复列表 (共3个回复)
沙发
eastcowboy [专家分:25370] 发布于 2011-10-03 09:21:00
不知道楼主为什么把这两个概念扯在一起,个人感觉它们没有太多的共同点,就比如有人问“走路和吃饭有什么区别”,我也不知道该怎么回答。
递归就是一个函数调用自己。尾递归也是递归(一个函数在最末尾的地方调用自己),只不过编译器可能会做优化。一旦优化成功,除了性能的提升之外,还可以避免堆栈溢出的情形。即使无限递归也不会造成溢出。
迭代应该是指多次计算,每次计算都更加的接近最终结果,因此,计算的次数增多了就能得到足够精确的近似值。迭代一般用循环来做,但没有规定不能用其它方法来做。比如,你可以用递归来做迭代。
板凳
windy0will [专家分:2300] 发布于 2011-10-03 11:39:00
递归和尾递归在函式编程里用的比较多吧,因为没有像for while等循环语句。
尾递归 在函数式语言里,基本上可以看成这样: 除了在控制递归结束的时候,函数直接调用它本身。用斐波切纳数列(a0=0 a1=1 a(n)=a(n-1)+a(n-2))来举例:
普通递归:
fun 0 = 0
fun 1 = 1
fun n = fun (n-1) + fun (n-2)
尾递归:
fun n = fun' 0 1 n
fun' x y 0 = x
fun' x y n = fun' (x+y) x (n-1)
上面的函数的自变量不能是负数。否则会出现 模式不匹配的错误。
其中函数 fun' 就是一个尾递归,因为 除了控制递归结束的条件外,fun' x y n 是直接调用它自己。
然而普通递归中的 fun函数不是尾递归, 它不是直接调用自己。
很显然,普通递归可读性要比尾递归好很多,它和看数学表达式差不多。现代的函数式语言编译器对普通递归也能有比较可观的优化,没有必要不要使用尾递归。
3 楼
larryliu [专家分:0] 发布于 2011-10-03 13:16:00
thx~~
我来回复