lisp - 尾递归函数与否

标签 lisp scheme tail-recursion

谁能帮我解决这个问题?

(define f (lambda (x)
  (cond
    ((null? x) 0)
    (#t (+ (* (car x) (car x)) (f (cdr x)))))))

我不明白这个函数是不是尾递归? 如果是,原因是什么?

最佳答案

它不是尾递归,因为函数在返回之前做的最后一件事是计算 (+ ...)。为了尾递归,返回之前的最后一个操作必须是递归调用。

使函数尾递归通常涉及一个带有累加器参数的辅助函数:

(define f0 (lambda (x acc)
  (if (null? x)
      acc
      (f0 (cdr x) (+ acc (* (car x)(car x)))))))

(define f (lambda (x)
  (f0 x 0)))

关于lisp - 尾递归函数与否,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17934515/

相关文章:

macros - 仅使用 LISP 原语定义 defmacro 函数?

emacs - elisp 表达式 (1+ (buffer-size)) 和 (+ 1 (buffer-size)) 是什么意思?

lisp - 从文件中返回单词列表

scheme 如何返回一个表单符号 + *

algorithm - 实现尾递归列表操作

lisp - 普通口齿不清 : Function returns function name

string - Lisp Scheme 使用 (string-set!) 遇到错误

clojure - 如何以纯函数的方式实现观察者设计模式?

erlang - 尾递归与非尾递归。前者慢吗?

recursion - 一个卷积函数可以写成尾递归形式吗?