【问题标题】:"application: not a procedure" while computing binomial计算二项式时的“应用程序:不是过程”
【发布时间】:2013-10-29 13:23:19
【问题描述】:

我正在定义一个函数binomial(n k)(又名帕斯卡三角形),但出现错误:

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

【问题讨论】:

  • 我应该提到我正在使用带有 Dr.Racket 的#lang 方案
  • 我尝试调用 binomial(1 2)
  • (binomial (n) (- k 1)) 的语法是什么?尝试记住 Scheme 中变量的语法,并与 (n) 的用法进行比较。
  • 请注意,此算法效率极低 - 指数递归调用次数!
  • 请在发布问题之前在 Stack Overflow 上搜索特定的错误消息。 (如果你这样做了,请原谅我的评论。)有other question about this error

标签: lisp scheme racket pascals-triangle


【解决方案1】:

在Scheme(和一般的Lisps)中,括号放在过程应用程序之前和过程的最后一个参数之后。你已经正确地做到了这一点,例如,

(= n 0)
(= n k)
(- k 1)
(binomial(- n 1) (- k 1))

但是,您对binomial 的一次调用的参数 中有一个错误:

(define (binomial n k)
  (cond  ((or (= n 0) (= n k)) 1)
      (else (+ (binomial(n) (- k 1))(binomial(- n 1) (- k 1)))))) 
                        ***

基于上述语法(n) 是一个应用程序,其中n 应该评估为一个过程,并且该过程将在没有参数的情况下被调用。当然,n 这里实际上计算为一个整数,它不是一个过程,并且不能被调用(因此“应用程序:不是一个过程”)。您可能想删除 n 周围的括号:

(binomial n (- k 1))

还值得指出的是,Racket 博士应该突出显示与我在上面所做的相同部分的代码。当我加载您的代码并评估 (binomial 2 1) 时,我得到以下结果,其中突出显示了 (n)

【讨论】:

    【解决方案2】:

    你的错误在这里:

    binomial(n)
    

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

    【讨论】:

      【解决方案3】:

      这是正确的代码:

       (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))
      

      【讨论】:

        猜你喜欢
        • 2012-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        • 2019-04-24
        • 1970-01-01
        相关资源
        最近更新 更多