为什么 DrRacket 似乎将此识别为尾调用?
Why does DrRacket seem to identify this as a tail call?
考虑这个片段:
#lang racket
(define (f i)
(if (> i 5)
0
(+ 1 (f (+ 1 i)))))
在这里,对 f
的调用不在尾部位置,当我调试时,我看到一个越来越大的堆栈
(+ ...)
(f ...)
(f ...)
(f ...)
(f ...)
这是意料之中的。但是,当我将鼠标悬停在最后一行的开头时,会出现一个浅紫色箭头并指向函数定义的开头。如果我正确理解文档,它表示尾部位置。我错过了什么?
最后一行 的表格 在 f
的尾部位置。然而,对 f
的递归调用不是:如果您将鼠标悬停在 f
上,您将看到一个淡蓝色箭头,告诉您它与 f
函数绑定相同.这是显示这两件事的屏幕截图:
所有 (if ...)
形式及其两个结果都在尾部位置。 f
与函数定义的 f
相同,但不在尾部位置。
当你移动到B,你看到A➯B。这意味着你可以在A中找到B的定义。
当你移动到 A 并且看到 A ➯ B。你可以看到变量绑定出现。
考虑这个片段:
#lang racket
(define (f i)
(if (> i 5)
0
(+ 1 (f (+ 1 i)))))
在这里,对 f
的调用不在尾部位置,当我调试时,我看到一个越来越大的堆栈
(+ ...)
(f ...)
(f ...)
(f ...)
(f ...)
这是意料之中的。但是,当我将鼠标悬停在最后一行的开头时,会出现一个浅紫色箭头并指向函数定义的开头。如果我正确理解文档,它表示尾部位置。我错过了什么?
最后一行 的表格 在 f
的尾部位置。然而,对 f
的递归调用不是:如果您将鼠标悬停在 f
上,您将看到一个淡蓝色箭头,告诉您它与 f
函数绑定相同.这是显示这两件事的屏幕截图:
所有 (if ...)
形式及其两个结果都在尾部位置。 f
与函数定义的 f
相同,但不在尾部位置。
当你移动到B,你看到A➯B。这意味着你可以在A中找到B的定义。
当你移动到 A 并且看到 A ➯ B。你可以看到变量绑定出现。