5

我想编写一个函数来使用尾递归查找 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)))))

使用二项式系数的以下性质

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

4

2 回答 2

7

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

或者,给 main 函数一个可选的accumulator 参数,默认值为 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))))))

The latter option is slightly less efficient, since the error condition is checked in every recursive call.

于 2010-10-31T13:11:10.247 回答
3

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

于 2010-10-31T13:03:23.647 回答