什么是CPS
在函数式编程中,CPS (Continuation-Passing Style)是一种编程风格:所有的控制块都通过 continuation 来显式传递。简单来说,在CPS风格中,函数不能有返回语句,它的调用者要想获得它的结果,需要显式传递一个回调函数来获取结果并继续执行。而为了保证整个程序执行下去,这个回调函数还会一直嵌套下去。这里的回调函数就是一个“continuation”。暂时找不到好的翻译,就保留它的原文。
下面来看一个递归的例子,比如常见的计算数学阶乘的函数:
// 原来代码
function fact(n) {
if (n == 0)
return 1 ;
else
return n * fact(n-1) ;
}
// CPS风格代码
function fact(n,ret) {
if (n == 0)
ret(1) ;
else
fact(n-1, function (t0) {
ret(n * t0) }) ;
}
// 调用入口
fact (5, function (n) {
console.log(n) ; // Output 120
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
上面是传统的递归实现,下面是CPS风格的实现。可以看到return语句被替换成一个回调函数的调用,而相乘这个动作会在接下来的递归里通过嵌套的回调函数完成,直到终止条件。你可以理解为,在每一层的递归中,回调函数都会给参数多乘上一个系数,并调用上一层的回调函数,直到最外层打印结果。
————————————————
版权声明:本文为CSDN博主「择思」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jaytalent/article/details/105425616