见《函数式编程的魅力:CPS》文中图一、图二代码。
通过 Fibbonacci 理解 CPS:
CPS 的基本形式是这样的,对于 FuncCps ( elem cont ) 方法,在 FuncCps 内部实现 cont ( f ( elem ) ),更确切地说,是在 FuncCps 内部实现 SomeFunc ( cont ( f ( elem ) ) ),这个 SomeFunc 便是 FuncCps 内部处理 cont ( f ( elem ) ) 的方式。
通过 CPS 理解 Fibbonacci:
将图中的代码动手展开(此处略),可以发现,当 a 为 1 或 2 时,向 SomeFunc ( cont ( elem ) ) 中代入 1,实际也就是若干个 1 的加和,通过 Lambda 式全面展示了 Fibbonacci 算数的本质。局部而言,CPS 方法使 Fibbonacci 分为两支,先算一支通到底,让另一支存入 Lambda 算式。整体而言,Fibbonacci 展开的是一棵算式树,CPS 算法是前序遍历的。有意思的也便是在迭代过程中 cont 的变化,也就是这支保存另一支的 Lambda 算式的变化。这种变化的感觉,很像九连环的玩儿法。比如前序遍历到最左叶时,代入 FibbonacciCont 的 a 和 cont 如下:
a: 2
cont: fun x->F(3)(fun y–>F(5)(fun y'->F(7)(fun y''->F(9)(fun y'''->x+y+y'+y''+y'''))))
像不像九连环?