Lisp &引用;应用:非程序“;在计算二项式时

Lisp &引用;应用:非程序“;在计算二项式时,lisp,scheme,racket,pascals-triangle,Lisp,Scheme,Racket,Pascals Triangle,我正在定义一个函数二项式(nk)(又称帕斯卡三角形),但得到一个错误: application: not a procedure; expected a procedure that can be applied to arguments given: 1 arguments...: 2 我不理解错误,因为我认为这定义了我的函数: (define (binomial n k) (cond ((or (= n 0) (= n k))

我正在定义一个函数
二项式(nk)
(又称帕斯卡三角形),但得到一个错误:

    application: not a procedure;
    expected a procedure that can be applied to arguments
    given: 1
    arguments...:
    2
我不理解错误,因为我认为这定义了我的函数:

    (define (binomial n k)
      (cond  ((or (= n 0) (= n k)) 1)
          (else (+ (binomial(n) (- k 1))(binomial(- n 1) (- k 1)))))) 
您的错误如下:

binomial(n)

n
是一个整数,不是函数。如果您像这样在其周围加上括号,scheme会尝试将整数作为函数调用,这自然会产生错误。

这是正确的代码:

 (define (binomial n k)
          (cond  ((or (= n 0) (= n k)) 1)
              (else (+ (binomial n (- k 1))(binomial(- n 1) (- k 1)))))) 
问题在于:

(binomial (n) (- k 1))
在Scheme(以及通常的Lisp)中,括号放在过程应用程序之前和过程的最终参数之后。您在中正确地完成了此操作,例如

(= n 0)
(= n k)
(- k 1)
(binomial(- n 1) (- k 1))
但是,您对
二项式
调用的一个参数中有一个错误:

(define (binomial n k)
  (cond  ((or (= n 0) (= n k)) 1)
      (else (+ (binomial(n) (- k 1))(binomial(- n 1) (- k 1)))))) 
                        ***
基于上述语法,
(n)
是一个应用程序,其中
n
应计算为一个过程,并且该过程将被无参数调用。当然,
n
这里的计算结果实际上是一个整数,它不是一个过程,不能被调用(因此“application:nota procedure”)。您可能希望删除
n
周围的括号:

(binomial n (- k 1))
同样值得指出的是,Racket博士应该强调我上面所做的代码的相同部分。当我加载您的代码并计算
(二项式2 1)
时,我会得到以下结果,其中突出显示
(n)


我应该提到,我正在使用#lang scheme与RacketI博士一起尝试调用二项式(12)什么是
(二项式(n)(-k1))
?试着记住Scheme中变量的语法,并与
(n)
的使用进行比较。注意,该算法效率极低-递归调用的数量是指数级的!在发布问题之前,请搜索有关堆栈溢出的特定错误消息。(如果你这样做了,那么请原谅我的评论。)有。