Написание продукта (функция), аналогичные суммы


Упражнение 1.31

а. Сумма процедура только самые простые из огромное количество подобных абстракций что может быть захвачено в качестве высшего порядка процедуры.51 написать аналогичное процедура называется продукт, который возвращает произведение значений функция в точках за определенный диапазон. Показать, как определить факториал точки зрения продукта. Также используют продукт для вычисления приближений к использованию Пи / 4 = (2/3) * (4/3) * (4/5) * (6/5) * (6/7) * (8/7) ...

б. Если процедура продукта порождает рекурсивный процесс, пишите одна, что порождает итерационный процесс. Если она порождает итеративный процесс, напишу один, что создает рекурсивный процесс.

Я написал следующее:

Рекурсивно:

(define (product term a next b)
  (cond 
    ((> a b) 1)
    (else (* (term a) (product term (next a) next b)))))

Итерационный:

(define (i-product term a next b)
  (cond ((> a b) null)
      (else 
       (define (iter a result)
         (cond ((> a b) result)
               (else (iter (next a) (* (term a) result)))))
       (iter a 1))))

Умножение-чисел [тест - ничего (продукта ... работы)?]

(define (identity x) x)
(define (inc x) (+ 1 x))
(define (multiply-integers a b) (i-product identity a inc b))

Вычислить Пи:

(define (square x) (* x x))
(define (compute-pi steps)
  (define (next n) (+ n 2.0))
  (* 8.0 (* steps 2) (/ (i-product square 4.0 next (* (- steps 1) 2)) 
              (i-product square 3.0 next (* steps 2)))))

Факториал:

(define (factorial n)
  (define (next n) (+ n 1))
  (i-product identity 1 next n))

Что вы думаете о моем решении?



996
0
задан 30 марта 2011 в 02:03 Источник Поделиться
Комментарии
1 ответ

Поскольку ваши определения имеют только два Конд положения, вы можете заменить Конд С если. Ваш итерационного определения является отступлением от суммы. Она должна возвращать 1 (продукта), когда а больше чем Б, а не нуль. Это делает внешний Конд ненужных.

Ваше определение вычислений-Пи страдает от неточности поплавок операций (в нем не производят значимого значения для N > 85). Было бы лучше, чтобы преобразовать в float после вычисления аппроксимирующей дроби.

(define (product term a next b)
(if (> a b)
1
(* (term a) (product term (next a) next b))))

(define (i-product term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (* (term a) result))))
(iter a 1))

(define (compute-pi steps)
(define (next n) (+ n 2))
(* 8.0 (* steps 2) (/ (i-product square 4 next (* (- steps 1) 2))
(i-product square 3 next (* steps 2)))))

1
ответ дан 31 марта 2011 в 01:03 Источник Поделиться