我无法弄清楚如何使这个尾递归Scheme函数不再是尾递归.有人可以帮助我吗?
(define (foldrecl f x u)
(if (null? x)
u
(foldrecl f (cdr x) (f (car x) u))))
我无法弄清楚如何使这个尾递归Scheme函数不再是尾递归.有人可以帮助我吗?
(define (foldrecl f x u)
(if (null? x)
u
(foldrecl f (cdr x) (f (car x) u))))
左折是遗传迭代,但是您可以通过添加连续来轻松地使它们递归。
(let ((value expresion-that-calculates))
value)
所以在你的情况下:
(define (foldrecl f x u)
(if (null? x)
u
(let ((result (foldrecl f (cdr x) (f (car x) u))))
result)))
虽然这看起来很有希望,但它不能保证智能计划实现数字显示只返回result
并使其成为尾调用.右折叠更容易,因为它们本身是递归的:
(define (fold-right proc tail lst)
(if (null? lst)
tail
(proc (car lst)
(fold-right proc tail (cdr lst)))))
在这里,您可以清楚地看到递归部分需要成为 cons
的参数,因此除非它是基本情况,否则永远不会处于尾部位置。
另请注意,当程序调用proc
时,查看哪些参数变得更简单,结果tail
的尾巴和列表参数lst
.您甚至不需要阅读我的代码以知道如何使用它,但是您的我不知道x
和u
和ti是什么不帮助参数顺序不遵循Scheme中已知的任何fold
实现.