这段 javascript 代码没有看明白,请明白的人给我讲解下,非常感谢!

2016-06-08 10:45:08 +08:00
 palmers

代码如下:

//Here's the standard naive factorial:

function fact(n) {
  if (n == 0)
    return 1 ;
  else
    return n * fact(n-1) ;
}
//上面这段是没有问题的,下面的看不懂,请大家讲解下,非常感谢!

//Here it is in CPS:

function fact(n,ret) {
  if (n == 0)
    ret(1) ;
  else
    fact(n-1, function (t0) {
     ret(n * t0) }) ;
}

原文在这里http://matt.might.net/articles/by-example-continuation-passing-style/

5301 次点击
所在节点    Node.js
30 条回复
bramblex
2016-06-09 00:45:47 +08:00
@palmers

这个已经不是 js 里面的内容,而属于 “程序语言理论” ( PLT )范畴。虽然不是什么很复杂的东西,但是一般研究程序语言比较深入的人才会接触到。

然而你刚接触 js 没多久就接触到了这些东西,也确实很强啊。
fourstring
2016-06-09 07:04:43 +08:00
@bramblex 您好,看了一下您讲解尾递归的那篇文章,有几个问题想问
首先是您最开始举的那个普通递归的例子:
const fact = (n) => {
if (n <= 0) {
return 1;
} else {
return n * fact (n - 1);
}
};
它也在最后一个 return 调用了自己本身,为什么这就不是尾递归呢?
其次,您使用的“入口环境”是什么意思呢?(没太看明白)
另外,能否讲解一下进行尾递归时函数栈中的情况?(类似于您文章中“函数栈的作用”一节)
谢谢!
fourstring
2016-06-09 07:13:15 +08:00
@bramblex 刚刚去翻了翻维基百科,好像明白了。。。
非常感谢您的文章!
bramblex
2016-06-09 09:31:15 +08:00
bramblex
2016-06-09 09:35:12 +08:00
@fourstrin

n * fact (n - 1) 这个并不是调用自身呀,假设把乘号看成一个函数 mul 那么就得到 mul(n, fact(n-1)),并不是自身嘛
palmers
2016-06-09 15:13:00 +08:00
@bramblex 谢谢 您抬举我了
fourstring
2016-06-09 22:02:34 +08:00
@bramblex 喔,原来是这样理解,谢谢!
markx
2016-06-12 09:48:42 +08:00
请问各位能不能解释一下最后一行不能尾递归优化? 最后一行相当于是 fact(n-1, cb); 嘛
markx
2016-06-12 09:49:28 +08:00
@markx 检查了好多遍,却还是打错了……
请问各位能不能解释一下为什么最后一行代码不能尾递归优化? 最后一行相当于是 fact(n-1, cb); 嘛
palmers
2016-06-12 11:32:12 +08:00
@markx 因为最后一行 依然形成了串行 表达式(我自己发明的词语) 函数执行完毕后形成的算术表达式是这个样子的:

`5 * 4 * 3 * 2 * t0 ; 5 * 4 * 3 * 2 *1 * 1` //这是最后两次执行的过程

我的理解是这样的, 不知道对不对, 请参考.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/284319

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX