问题

我无法弄清楚如何使这个尾递归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.您甚至不需要阅读我的代码以知道如何使用它,但是您的我不知道xu和ti是什么不帮助参数顺序不遵循Scheme中已知的任何fold实现.

  相同标签的其他问题

recursionschemetail-recursionfoldfoldleft