Recursion let在尾部递归中是否作为goto指令工作?

Recursion let在尾部递归中是否作为goto指令工作?,recursion,scheme,Recursion,Scheme,我在方案中发现了二进制搜索的以下实现: (define (binary-search value vector) (let helper ((low 0) (high (- (vector-length vector) 1))) (if (< high low) #f (let ((middle (quotient (+ low high) 2))) (cond ((> (vector-re

我在方案中发现了二进制搜索的以下实现:

(define (binary-search value vector)
  (let helper ((low 0)
               (high (- (vector-length vector) 1)))
    (if (< high low)
        #f
        (let ((middle (quotient (+ low high) 2)))
          (cond ((> (vector-ref vector middle) value)
                 (helper low (- middle 1)))
                ((< (vector-ref vector middle) value)
                 (helper (+ middle 1) high))
                (else middle))))))
(定义(二进制搜索值向量)
(let辅助对象((低0)
(高(-(向量长度向量)1)))
(如果(<高-低)
#f
(let((中等(商(+低-高)2)))
(条件((>(矢量参考矢量中间)值)
(辅助对象低(-中1)))
((<(矢量参考矢量中间)值)
(助手(+中1)高)
(中(()()))
根据注释中的说明,上述函数使用尾部递归调用帮助函数。我想知道这是否像GOTO指令一样工作,因为我没有看到对二进制搜索函数的正确“递归”调用


在这种情况下,可以说它的工作原理类似于goto指令?

您看到的被称为命名的
let
。(如果你好奇的话,我写了一个。)你的代码与:

(define (binary-search value vector)
  (define (helper low high)
    (if (< high low)
        #f
        (let ((middle (quotient (+ low high) 2)))
          (cond ((> (vector-ref vector middle) value)
                 (helper low (- middle 1)))
                ((< (vector-ref vector middle) value)
                 (helper (+ middle 1) high))
                (else middle)))))
  (helper 0 (- (vector-length vector) 1)))
(定义(二进制搜索值向量)
(定义(辅助对象低-高)
(如果(<高-低)
#f
(let((中等(商(+低-高)2)))
(条件((>(矢量参考矢量中间)值)
(辅助对象低(-中1)))
((<(矢量参考矢量中间)值)
(助手(+中1)高)
(中(()))
(辅助对象0(-(向量长度向量)1)))
换句话说,它是尾部递归,在
helper
上,而不是在
二进制搜索上。但尾部递归正在发生


有些人认为尾部递归像<代码> Goto ,但我不认为这是一个有益的比较。两者之间唯一的共同点是,您可以使用尾部递归实现循环,就像您可以使用
goto
一样。但相似之处就到此为止:尾部递归是一种特殊的递归(当前调用框架被尾部调用替换),但它仍然是递归<代码>转到
跳到代码中的任意点,但这是一个与递归无关的完全命令式操作。

let只是lambdas的语法糖。例如:

(let ((i 2)
      (j 5)
  (* i j))
相当于

((lambda (i j) (* i j)) 2 5)

代码中的let称为命名let,因为您为其提供了标签。所以,基本上,你伪装的lambda与一个名字有关。从这个意义上说,这是一个后路。但是,您需要在let的范围内才能“跳转”到它。该函数是尾部递归的,因为您没有延迟任何计算。在任何时间点,您只需要i和j的当前值就可以继续计算。

谢谢,那么您的意思是真正进行递归的函数是对helper函数的调用吗?