Recursion LISP中使用尾部递归的二项式系数
我想编写一个使用尾部递归查找C(n,k)的函数,非常感谢您的帮助 我已经做到了这一点:Recursion LISP中使用尾部递归的二项式系数,recursion,lisp,tail-recursion,binomial-coefficients,Recursion,Lisp,Tail Recursion,Binomial Coefficients,我想编写一个使用尾部递归查找C(n,k)的函数,非常感谢您的帮助 我已经做到了这一点: (defun tail-recursive-binomial (n k) (cond ((or (< n k) (< k 0)) NIL) ((or (= k 0) (= n k)) 1) (T (* (tail-recursive-binomial (- n 1) (- k 1)) (/ n k))))) (defun尾部递归二项式(nk) (条件((或(
(defun tail-recursive-binomial (n k)
(cond ((or (< n k) (< k 0)) NIL)
((or (= k 0) (= n k)) 1)
(T (* (tail-recursive-binomial (- n 1) (- k 1)) (/ n k)))))
(defun尾部递归二项式(nk)
(条件((或(
使用
但是我不知道如何使递归调用成为每个实例执行的最后一条指令,因为最后一条指令就是产品。我一直在尝试使用辅助函数,我认为这是唯一的方法,但我还没有找到解决方案。您需要一个带有额外参数的辅助函数,用于计算和传递结果。正如starblue建议的,使用递归辅助函数:
(defun binom (n k)
(if (or (< n k) (< k 0))
NIL ; there are better ways to handle errors in Lisp
(binom-r n k 1)))
;; acc is an accumulator variable
(defun binom-r (n k acc)
(if (or (= k 0) (= n k))
acc
(binom-r (- n 1) (- k 1) (* acc (/ n k)))))
(defun binom(n k)
(如果(或(
或者,为主函数提供一个默认值为1的累加器参数(递归基本情况):
(除雾双筒望远镜(n k和可选)(附件1))
(条件((或(
后一种方法的效率稍低,因为每次递归调用都会检查错误条件。这是我的初始方法,因为我用这种方法编写了一个阶乘函数,但我没有用这个方法得到它。谢谢,谢谢。我一直在寻找一个类似于第一个的解决方案(更类似于我制作或看到的其他函数),但我喜欢第二个,非常优雅。
(defun binom (n k &optional (acc 1))
(cond ((or (< n k) (< k 0)) NIL)
((or (= k 0) (= n k)) acc)
(T (binom (- n 1) (- k 1) (* acc (/ n k))))))