Lisp递归平方使用一个变量

标签 lisp common-lisp

这是正在尝试的代码

(defun f (a n)
    (if (zerop n)
        1
        (* a (f a (- n 1)))))

(f 3) 应返回 27,(f 4) 应返回 256

我尝试使用两个变量,但这违反了规则。

是否可以通过递归仅使用一个变量?

感谢您的任何想法

最佳答案

我不懂 CL,但我知道 Clojure 和其他使用递归的语言。

如果递归函数有 1 个参数充当累加器,但仅在第一次调用时设置,则解决此问题的典型方法是将 f 包装在另一个函数中。有两种(基本上相同的)方法可以做到这一点:

(defun g (a n)
    (if (zerop n)
        1
        (* a (g a (- n 1)))))

(defun f (n)
    ; I'm assuming you want the initial value of "a" to be 1
    (g 1 n))

或者,更简洁地说:

(defun f (n)
  (let (g (fn (n)
            (if (zerop n)
              1
              (* a (g a (- n 1))))))))
    ; Instead of f being recursive, f calls g, which is recursive
    (g 1 n))

请原谅任何语法错误。

关于Lisp递归平方使用一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42346945/

相关文章:

lisp - 查找出现次数最多的列表并返回以出现次数最多的元素开头的列表

lisp - Lisp 中的线性搜索,数组错误

common-lisp - 循环遍历点列表的格式函数

macros - 评估宏体内传递的参数

lisp - 功能指示符不受欢迎?

lisp - 为什么 collect 函数在此 Lisp 代码中不起作用

emacs - Lisp 社区 - 优质教程/资源

lisp 二次方程的虚部和实部

clojure - 我怎样才能避免使用连续传递风格的堆栈?

list - Lisp S 表达式和列表长度/大小