"приложение: не процедура" во время вычисления бинома

Я определяю функцию 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)))))) 

3 ответа

Решение

В схеме (и в целом в 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))

Стоит также отметить, что доктор Ракет должен был выделить ту же часть кода, что и я выше. Когда я загружаю ваш код и оцениваю (binomial 2 1)Я получаю следующие результаты, в которых (n) выделено:

ошибка в др ракетке

Ваша ошибка здесь:

binomial(n)

n целое число, а не функция. Если вы поставите вокруг него круглые скобки, схема попытается вызвать целое число как функцию, что, естественно, приводит к ошибке.

Это правильный код:

 (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))
Другие вопросы по тегам