这道题比较简单,我们直接套用sum的过程,把“+”替换成“*”就可以了,另外还需要借助一个exact->inexact过程把分数转化为小数,刚开始没用这个过程,算出来分子和分母都很大的分数,验证不了结果的正确性。
#lang racket
//线性递归
(define (product-recursive term a next b)
(if (> a b)
1
(* (term a)
(product-recursive term (next a ) next b))))
//线性迭代
(define (product-iter term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (* result (term a)))))
(iter a 1))
(define (inc n) (+ n 1))
(define (cal-pi-f n)
(cond((even? n) (exact->inexact (/ (+ n 2) (+ n 1))))
(else (exact->inexact (/ (+ n 1) (+ n 2))))))
(define (cal-pi-recursive n)
(* (product-recursive cal-pi-f 1 inc n) 4))
(define (cal-pi-iter n)
(* (product-recursive cal-pi-f 1 inc n) 4))
//计算阶乘的过程
(define (identity x) x)
(define (factorial n)
(product-recursive identity 1 inc n))
(cal-pi-recursive 1000000)
(cal-pi-iter 1000000)
(factorial 10)
运行结果,比较接近PI的值,n取大一些能精确些,但是n过大会导致内存溢出,因为小数位数较大的两个小数相乘还是比较耗资源的。
3.1415942243828017
3.1415942243828017
3628800