"приложение: не процедура" во время вычисления бинома
Я определяю функцию 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))