Recursion 将尾部递归/迭代过程转变为完全递归过程

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过程。不要告诉我太多(毕竟,这

我目前正在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过程。不要告诉我太多(毕竟,这是一个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)))