博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
尾递归(Tail Recursion)和Continuation
阅读量:5243 次
发布时间:2019-06-14

本文共 1582 字,大约阅读时间需要 5 分钟。

递归: 就是函数调用自己。 func() { foo(); func(); bar(); }

尾调用:就是在函数的最后,调用函数(包括自己)。 foo(){ return bar(); }
尾递归:就是在函数的最后,调用自身。 func() { foo(); return func(); }

尾递归是递归的优化,优化的目的是栈深度=1,永不StackOverflow。所有的递归都能转成尾递归。简单的场景,比如计算阶乘N!和Fibonacci数列,可以用parameter代替临时变量,实现尾递归。复杂的场景,比如对二叉树进行先序遍历(pre-order traversal, 深度优先遍历),就需要使用Continuation Passing Style(CPS)才能实现尾递归。

简单的场景比较好理解,定义里有多少个递归的临时变量,就用多少个参数即可。比如:

//阶乘:N! = (N-1)! * Nstatic int Factorial_TailRecursion(int target, int total = 1) {    if (target <= 1) {        return total;    } else {        return Factorial_TailRecursion(target - 1, total * target);    }}//Fibonacci数列:f(n) = f(n-1) + f(n-2)static int Fibonacci_TailRecursion(int target, int n1 = 0, int n2 = 1) {    if (target <= 0) {        return n1;    } else {        return Fibonacci_TailRecursion(target - 1, n2, n1 + n2);    }}

至于CPS的写法,比如func(int i, Func<int, int> continuation),要这么看:用func处理i返回的结果,还需要继续用continuation处理,这就是继续(Continuation)的含义。仍然以为例:

static int Factorial_Continuation(int target, Func
func) { if (target <= 1) { return func(1); } else { //以5为例,计算Fac(4)的值,后续*5再传入func return Factorial_Continuation(target - 1, n => func(n * target)); }}static int Fibonacci_Continuation(int target, Func
func) { if (target < 2) { return func(target); } else { //以5为例,计算Fib(4)的值、后续计算Fib(3)的值、两值相+再传入func return Fibonacci_Continuation(target - 1, r1 => Fibonacci_Continuation(target - 2, r2 => func(r1 + r2))); }}
参考

转载于:https://www.cnblogs.com/AlexanderYao/p/5449816.html

你可能感兴趣的文章
简单的数据库操作
查看>>
解决php -v查看到版本与phpinfo()版本不一致问题
查看>>
iOS-解决iOS8及以上设置applicationIconBadgeNumber报错的问题
查看>>
亡灵序曲-The Dawn
查看>>
Redmine
查看>>
帧的最小长度 CSMA/CD
查看>>
xib文件加载后设置frame无效问题
查看>>
编程算法 - 左旋转字符串 代码(C)
查看>>
IOS解析XML
查看>>
Python3多线程爬取meizitu的图片
查看>>
树状数组及其他特别简单的扩展
查看>>
zookeeper适用场景:分布式锁实现
查看>>
110104_LC-Display(液晶显示屏)
查看>>
httpd_Vhosts文件的配置
查看>>
php学习笔记
查看>>
普通求素数和线性筛素数
查看>>
React Router 4.0 基本使用
查看>>
PHP截取中英文混合字符
查看>>
【洛谷P1816 忠诚】线段树
查看>>
电子眼抓拍大解密
查看>>