Recursion LISP中使用尾部递归的二项式系数

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) (条件((或(

我想编写一个使用尾部递归查找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)
(条件((或(
使用


但是我不知道如何使递归调用成为每个实例执行的最后一条指令,因为最后一条指令就是产品。我一直在尝试使用辅助函数,我认为这是唯一的方法,但我还没有找到解决方案。

您需要一个带有额外参数的辅助函数,用于计算和传递结果。

正如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))))))