Recursion 将尾部递归/迭代过程转变为完全递归过程
我目前正在Scheme中编写一个简单的程序,它将数字递归地相加,而不使用+运算符。现在我有一个程序,它完成了我想做的事情:Recursion 将尾部递归/迭代过程转变为完全递归过程,recursion,scheme,tail-recursion,Recursion,Scheme,Tail Recursion,我目前正在Scheme中编写一个简单的程序,它将数字递归地相加,而不使用+运算符。现在我有一个程序,它完成了我想做的事情: (define (add1 x) (+ x 1)) (define (sub1 x) (- x 1)) (define (plus x y) (if (zero? y) x (plus (add1 x) (sub1 y)) ) ) 然而,我的导师要求我放弃尾部递归/迭代,编写完全递归的plus过程。不要告诉我太多(毕竟,这
(define (add1 x) (+ x 1))
(define (sub1 x) (- x 1))
(define (plus x y)
(if (zero? y)
x
(plus (add1 x) (sub1 y))
)
)
然而,我的导师要求我放弃尾部递归/迭代,编写完全递归的plus过程。不要告诉我太多(毕竟,这是一个Uni练习),你能给我指出正确的方向,让我知道怎么做吗
提前谢谢 我同意这些评论,这是一个愚蠢的练习-你的答案很好,它已经是一个解决方案,比讲师要求的解决方案更有效(它也是递归的,但不是尾部递归的。称之为完全递归是用词不当)。无论如何,这里有一个提示:
(define (plus x y)
(if (zero? y) ; the first part remains unchanged
x
<???>)) ; now, what do we put here?
扩展到:
(add1 (plus 4 2))
(add1 (add1 (plus 4 1)))
(add1 (add1 (add1 (plus 4 0))))
(add1 (add1 (add1 4)))
在上面的例子中,
4
在开始时被绑定到x
和3
到y
,执行程序后,我们看到add1
被调用了三次,第一次我们将1
添加到4
,然后将1
添加到5
,最后将1
添加到6
,直到我们获得7
。换句话说:递归步骤必须调用add1
到递归调用plus
的结果,其中x
保持不变,y
递减一个单位直到它达到零,此时,我们到达基本情况,递归展开返回正确的结果。如果不希望尾部递归,只需移动add1
,但我不会说在哪里。(我很确定,add1
怎么不用+
?告诉你的导师尾部递归也是“完全递归”的。这是我听过的最愚蠢的练习。为了增加愚蠢(双关语):add1
正在调用+
,所以不管怎样,我们得到了一个类似这样的扩展:(+1(+1(+14))
。是的,我们最后使用了+
。很可能他们打算在这里将add1
用作原语。:)谢谢,我通过将add1移到if块的递归调用之外,并将x和sub1 y传递到递归中,解决了这个问题。
(add1 (plus 4 2))
(add1 (add1 (plus 4 1)))
(add1 (add1 (add1 (plus 4 0))))
(add1 (add1 (add1 4)))