Вопрос

Я работаю через 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top