2016-12-16 2 views
-2

Я начинаю разбираться с Lisp, и я пытаюсь написать процедуру для аппроксимации pi с использованием формулы Лейбница в настоящий момент; Я думаю, что я рядом, но я не уверен, как действовать дальше. Текущее поведение заключается в том, что он делает первый расчет правильно, но затем программа завершает работу и отображает номер «1». Я уверен, если я могу вызвать определенную функцию рекурсивно, как это,Рекурсивный звонок из Отделения условий

;;; R5RS 
(define (pi-get n) 
    (pi 0 1 n 0)) 

(define (pi sum a n count) 
    ;;; if n == 0, 0 
    (if (= n 0) 0) 
    ;;; if count % 2 == 1, + ... else -, if count == n, sum 
    (cond ((< count n) 
     (cond ((= (modulo count 2) 1) 
       (pi (+ sum (pi-calc (+ 2 a))) (+ a 2) n (+ count 1))) 
       (pi 
       (- sum (pi-calc (+ 2 a))) (+ a 2) n (+ count 1)))))) 

(define (pi-calc a) 
    (/ 1.0 a)) 

Извинения, если это немного нечитаемым, я только учусь Lisp несколько недель, и я не уверен, что обычное форматирование будет для языка. Я добавил несколько комментариев, надеюсь, поможет.

ответ

0

Как сказал Сильвестр, это оказалось ошибкой с моей стороны с синтаксисом.

;;; R5RS 
(define (pi-get n) 
(pi 1 1 n 0)) 

(define (pi sum a n count) 
(if (= n 0) 0) 
(cond ((< count n) 
    (cond ((= (modulo count 2) 1) 
      (pi (+ sum (pi-calc (+ 2 a))) (+ a 2) n (+ count 1))) 
      ((= (modulo count 2) 0) 
      (pi (- sum (pi-calc (+ 2 a))) (+ a 2) n (+ count 1)))) 
(display (* 4 sum)) (newline)))) 

(define (pi-calc a) 
(/ 1.0 a)) 
+1

'if' versus' cond' не имеет к этому никакого отношения. У вас слишком мало скобок для 'cond' и в боте вашего исходного сообщения, и это вы игнорируете случаи, которые заканчиваются как неопределенные значения вместо ответов. В частности, печать в конце - это то, что делает возвращаемое значение, поэтому оно всегда будет неопределенным. – Sylwester

+0

Странно, потому что Racket не дал мне синтаксической ошибки и до сих пор этого не делает. Также я считаю, что теперь понимаю, что я должен был определить сумму, если бы захотел вернуть фактическое значение. – I2obiN

+0

Это было верно, потому что круглые скобки вокруг последнего 'pi' стали термином вместо вызова процедуры, которую он оценил как предикат, а аргументы стали последующими выражениями .. Нет синтаксической ошибки, но вряд ли это намерение. Посмотрите, как я отформатировал ваш исходный код. – Sylwester

Смежные вопросы