这两个球拍功能在速度/效率方面有何不同?

时间:2013-10-18 18:14:16

标签: recursion functional-programming scheme racket

(define (myminus x y)
  (cond ((zero? y) x)
        (else (sub1 (myminus x (sub1 y))))))

(define (myminus_v2 x y)
  (cond ((zero? y) x)
        (else (myminus_v2 (sub1 x) (sub1 y)))))

请评论这些功能之间的差异 每次递归调用都需要大量内存。另外,哪个版本可能 你期望更快,为什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

他们都应该有一些与y成比例的步骤。

第二个是尾调用,意味着解释器可以执行尾部消除,这意味着它占用堆栈上的常量空间,而在第一个堆栈的大小与Y成比例。

答案 1 :(得分:2)

myminus为递归计算的y创建sub1个连续符。这意味着你可以排出球拍内存限制,使程序失败。在我的试验中,即使只有1000万人在 DrRacket 中使用标准的128MB限制也不会成功。

myminus_v2tail recursive,因为racket具有与scheme所需的相同的属性,所以尾调用将被优化为goto而不会增长堆栈,y可以是任何大小,即只有你的可用内存和处理能力是大小的限制。

您的程序是peano arithmetic的很好的例子。