Recursion &引用;及;和尾递归

Recursion &引用;及;和尾递归,recursion,scheme,tail-recursion,Recursion,Scheme,Tail Recursion,我可以使用递归调用和语句构建迭代过程吗 例如,purpose,我们有一个函数foo,它什么都不做。它将创建什么样的过程(迭代或递归) (定义(foo?bar) (如果(10 1)(foo?(-bar 1)()))) 是的,和可以-您可以在中阅读。为了兰伯特的缘故,让我们扩展语法 (define (foo? bar) (if (< bar 0) #t ; tail position, but no call (if (> 10 1)

我可以使用递归调用
语句构建迭代过程吗

例如,purpose,我们有一个函数
foo
,它什么都不做。它将创建什么样的过程(迭代或递归)

(定义(foo?bar)
(如果(10 1)(foo?(-bar 1)())))

是的,
可以-您可以在中阅读。

为了兰伯特的缘故,让我们扩展语法

(define (foo? bar) 
  (if (< bar 0) 
      #t ; tail position, but no call
      (if (> 10 1) 
          (foo? (- bar 1)) ; tail position
          #f))) ; tail position, but no call
(定义(foo?bar)
(如果(<0巴)
#t;尾部位置,但没有呼叫
(如果(>10 1)
(foo?(-bar 1));尾部位置
#f) );尾部位置,但没有呼叫

这将是递归的,因为您调用的最后一个函数是
,而不是
foo?
@Gabe:
是语法,而不是过程。@leppie:假设编译器一开始并没有优化整个过程,这会如何改变任何东西?@Lambert:不管优化如何,Scheme对
有标准语法定义。请看:谢谢你的链接。。。我还在想办法。你能解释一下为什么是迭代的吗?我认为不是,因为递归调用不是函数中的最后一个操作。+1我认为这是正确的答案。从标准(通过帖子中的链接)
(和*)
有趣+尽管我不同意。但是有人能解释为什么吗?它之所以有效,是因为
foo?
调用是
的最后一个子表达式,因此它保证是最后一个被调用的函数。另外,
不是函数,它是一种特殊形式,就像
if
一样。最后一个操作并不是真正检查返回值。由于
foo?
之前的所有表达式都已被调用并被证明为#t,因此只需直接调用
foo?
。是的,感谢您花时间编写本文!这确实说明了问题!:D
(define (foo? bar) 
  (if (< bar 0) 
      #t ; tail position, but no call
      (if (> 10 1) 
          (foo? (- bar 1)) ; tail position
          #f))) ; tail position, but no call