Scheme递归或迭代

时间:2015-01-17 15:05:10

标签: recursion scheme iteration

(define unique?
  (lambda (l)
    (or (null? l) 
        (null? (cdr l))
        (and (not (in? (car l) (cdr l))) 
             (unique? (cdr l)))))

有人可以告诉我它是迭代还是递归程序?我想这是迭代的,但我不确定,我不知道如何解释我

3 个答案:

答案 0 :(得分:1)

您的代码显然是递归的,因为unique?调用unique?。如果递归调用发生在尾部位置,则过程unique?将是迭代的。 R6RS标准,参见第11.20节“尾调用和尾部上下文”,详细说明了每种句法形式的尾部上下文。将您的lambda我们推理为:

  • lambda中的最后一个表达式是尾部上下文,因此or ...是尾部表达式
  • or中的最后一个表达式是尾部表达式,因此and ...是尾部表达式
  • and中的最后一个表达式是尾部表达式,因此您的unique?是尾部调用

因此,unique?将自己称为尾调用,因此是迭代的。

答案 1 :(得分:0)

该函数是递归的,因为它调用自身。但请注意,由于它是尾递归的,因此可以将其编译为迭代形​​式。

函数是尾递归的标准就是递归调用返回后无事可做,这在你的情况下是正确的。

如何将尾递归函数转换为循环

  

要将尾递归函数转换为while循环,请按照   以下步骤。 (没有用于转换的自动功能   任意递归函数进入while循环 - 你必须转换它   首先进入尾递归函数。)

     
      
  1. 将辅助函数参数转换为局部变量;其   初始值与调用的初始值相同   主函数的辅助函数。
  2.   
  3. 继续测试与辅助函数中的测试相同,   对于导致尾递归调用的方向。 (如果   尾递归调用出现在if的else部分,然后添加   打电话给不。)
  4.   
  5. 身体使用套装!更新每个变量的值;价值   与传递给tail-recursive调用的参数相同。
  6.   
  7. 返回累加器的值;这是在一段时间之后   循环。
  8.   

来源:Tail recursion and loops

答案 2 :(得分:0)

由于其他两个答案解释了你的函数是尾递归的原因和原因;我将为初学者留下一个简单的方法来记住差异:

- 递归函数 在递归调用上

- 尾递归函数 在递归调用上运行