(define unique?
(lambda (l)
(or (null? l)
(null? (cdr l))
(and (not (in? (car l) (cdr l)))
(unique? (cdr l)))))
有人可以告诉我它是迭代还是递归程序?我想这是迭代的,但我不确定,我不知道如何解释我
答案 0 :(得分:1)
您的代码显然是递归的,因为unique?
调用unique?
。如果递归调用发生在尾部位置,则过程unique?
将是迭代的。 R6RS标准,参见第11.20节“尾调用和尾部上下文”,详细说明了每种句法形式的尾部上下文。将您的lambda
我们推理为:
lambda
中的最后一个表达式是尾部上下文,因此or ...
是尾部表达式or
中的最后一个表达式是尾部表达式,因此and ...
是尾部表达式and
中的最后一个表达式是尾部表达式,因此您的unique?
是尾部调用因此,unique?
将自己称为尾调用,因此是迭代的。
答案 1 :(得分:0)
该函数是递归的,因为它调用自身。但请注意,由于它是尾递归的,因此可以将其编译为迭代形式。
函数是尾递归的标准就是递归调用返回后无事可做,这在你的情况下是正确的。
要将尾递归函数转换为while循环,请按照 以下步骤。 (没有用于转换的自动功能 任意递归函数进入while循环 - 你必须转换它 首先进入尾递归函数。)
- 将辅助函数参数转换为局部变量;其 初始值与调用的初始值相同 主函数的辅助函数。
- 继续测试与辅助函数中的测试相同, 对于导致尾递归调用的方向。 (如果 尾递归调用出现在if的else部分,然后添加 打电话给不。)
- 身体使用套装!更新每个变量的值;价值 与传递给tail-recursive调用的参数相同。
- 返回累加器的值;这是在一段时间之后 循环。
醇>
答案 2 :(得分:0)
由于其他两个答案解释了你的函数是尾递归的原因和原因;我将为初学者留下一个简单的方法来记住差异:
尾 - 递归函数 在递归调用上 。
非 - 尾递归函数 在递归调用上运行。