scheme - 为什么 DrRacket 似乎将此识别为尾调用?

标签 scheme racket tail-recursion

考虑这个片段:

#lang racket

(define (f i)
  (if (> i 5)
      0
      (+ 1 (f (+ 1 i)))))

在这里,对 f 的调用不在尾部位置,当我调试时,我看到越来越多的表单堆栈

(+ ...)
(f ...)
(f ...)
(f ...)
(f ...)

这是预料之中的。但是,当我将鼠标悬停在最后一行的开头时,会出现一个浅紫色箭头并指向函数定义的开头。如果我正确理解文档,它表示尾部位置。我错过了什么?

最佳答案

最后一行的形式相对于f的尾部位置。然而,对 f 的递归调用不是:如果您将鼠标悬停在 f 上,您将看到一个淡蓝色箭头,告诉您它是相同的 f 函数是绑定(bind)的。这是显示这两件事的屏幕截图:

arrows

所有 (if ...) 形式及其两个结果都在尾部位置。 f 与函数定义的 f 相同,但不在尾部位置。

关于scheme - 为什么 DrRacket 似乎将此识别为尾调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66506064/

相关文章:

scheme - 学习计划的好处?

lisp - 是否有实现条件重启系统的书籍/指南

F# 使用累加器,仍然出现堆栈溢出异常

我可以强制编译器不优化尾递归吗?

function - F#:递归函数:连接两个列表之间的公共(public)值

lisp - PC Scheme TI 实现中的 NIL 表示

recursion - 方案将变量传递给可变参数函数

racket - cons 两个元素输出错误的结果

functional-programming - SICP - 阶乘的命令式与功能式实现

scheme - Racket 中的各种续传