СИКП 1.31:Аппроксимация Пи
Вопрос
Я работаю через SICP самостоятельно, поэтому у меня нет инструктора, который мог бы об этом спросить.Предполагается, что этот код аппроксимирует число Пи, но вместо этого всегда возвращает ноль.
(define (approx-pi acc)
(define (factors a)
(define basic-num
(if (= (mod a 2) 0)
(/ a 2)
(/ (- a 1) 2)))
(if (= (mod basic-num 2) 0)
basic-num
(/ 1 basic-num)))
(* 4 (product factors 5 (* 2 acc))))
Вот процедуры мода и продукта, на которые ссылаются в этом коде.Кажется, это не проблема, но я включу их на всякий случай.
(define (product func lo hi)
(define (product-iter i result)
(if (> i hi)
result
(product-iter (+ 1 i) (* result (func i)))))
(product-iter 1 1))
(define (mod a b)
(if (< (- a b) 0)
a
(mod (- a b) b)))
Все дело в реализации формулы:
пи/4 = (2*4*4*6...)/(3*3*5*5...)
Моя ошибка, очевидно, довольно глупая, но я новичок в Scheme, поэтому не могу ее найти.Если у кого-нибудь есть стилистические советы, я тоже буду очень признателен.Спасибо!
Решение
У вашей функции продукта есть небольшой недостаток:
(product + 4 5)
возвращает 120, если правильный ответ — 20.Причина в том
(product-iter 1 1) should be (product-iter lo 1)
Другие советы
В звонке к product-iter
в функции product
, это будет сделать(* 1 (factor 1))
прямо в первой итерации, которая будет равна 0, потому что (factor 1)
равен 0.Следовательно, общий продукт также будет равен 0.