(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)))))
请评论这些功能之间的差异 每次递归调用都需要大量内存。另外,哪个版本可能 你期望更快,为什么?
谢谢!
答案 0 :(得分:3)
他们都应该有一些与y成比例的步骤。
第二个是尾调用,意味着解释器可以执行尾部消除,这意味着它占用堆栈上的常量空间,而在第一个堆栈的大小与Y成比例。
答案 1 :(得分:2)
myminus
为递归计算的y
创建sub1
个连续符。这意味着你可以排出球拍内存限制,使程序失败。在我的试验中,即使只有1000万人在 DrRacket 中使用标准的128MB限制也不会成功。
myminus_v2
是tail recursive
,因为racket
具有与scheme
所需的相同的属性,所以尾调用将被优化为goto而不会增长堆栈,y可以是任何大小,即只有你的可用内存和处理能力是大小的限制。
您的程序是peano arithmetic的很好的例子。