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函数的调用吗?