什么是尾递归?和递归的关系是?
尾递归是递归的一种特殊形式,即在函数的末尾,返回调用该函数的结果,例如下列计算阶乘的函数(Scheme):
(define (factorial n) (define (iter product counter) (if (> counter n) product (iter (* counter product) (+ counter 1)))) (iter 1 1))
iter 的末尾,要么返回一个数值(product)要么返回一个对 iter 自己的调用,这就叫尾递归。
iter
product
尾递归的意义在于,所有的尾递归都可以被编译器简单地优化成普通循环,而不必像通常的递归一样,每次调用都消耗额外的栈空间。这是因为,在递归调用发生时,函数已经运行到了末尾,编译器无需再在栈中维护这个函数的环境,只需简单地用下一个函数调用的环境覆盖当前环境即可。
参考:
最后非常推荐读一下 计算机程序的构造和解释 这本书会讲到包括尾递归在内的,大量改善计算机程序复杂性的基本技巧,上面的例子也摘自本书。
大概是循环式的递归。每次递归更新某些变量,而不是产生更多同级别的调用自身。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(2)
尾递归是递归的一种特殊形式,即在函数的末尾,返回调用该函数的结果,例如下列计算阶乘的函数(Scheme):
iter
的末尾,要么返回一个数值(product
)要么返回一个对iter
自己的调用,这就叫尾递归。尾递归的意义在于,所有的尾递归都可以被编译器简单地优化成普通循环,而不必像通常的递归一样,每次调用都消耗额外的栈空间。这是因为,在递归调用发生时,函数已经运行到了末尾,编译器无需再在栈中维护这个函数的环境,只需简单地用下一个函数调用的环境覆盖当前环境即可。
参考:
最后非常推荐读一下 计算机程序的构造和解释 这本书会讲到包括尾递归在内的,大量改善计算机程序复杂性的基本技巧,上面的例子也摘自本书。
大概是循环式的递归。每次递归更新某些变量,而不是产生更多同级别的调用自身。