SICP:1.37 递归/迭代求无穷连分式

#lang racket

(define (cont-frac N D k)
  (define (cf t)
    (if (= t 1)
    (/ (N t) (D t))
    (/ (N t) (+ (D t) (cf (- t 1))))
    );if
    );cf
  (cf k)
  );cont-frac

(define (cont-frac-iteration N D k)
  (define (cf result t)
    (if (= t k)
    result
    (cf (/ (N t) (+ (D t) result));/
        (+ t 1));cf
    );if
    );cf
  (cf (/(N k) (D k)) 1)
  );cont-frac-iteration


(cont-frac (lambda(i) 1.0)
       (lambda(i) 1.0)
       10)

(cont-frac-iteration (lambda(i) 1.0)
       (lambda(i) 1.0)
       10)

因为连分式本质上就是一个除法计算序列,所以题目给出 k 项连分式:

N1D1+N2+NkDk

可以转换成以下等价的除法计算序列:

N1/(D1+(N2/(D2++(Nk/Dk))))

而这个除法序列又可以用一个递归表达式来表示:

cf(1)
N1/(D1+cf(2))
N1/(D1+(N2/(D2+cf(3))))
N1/(D1+(N2/(D2+(N3/(D3+cf(4))))))
N1/(D1+(N2/(D2+(N3/(D3++(Nk/Dk))))))

其中函数 cf(i) 表示连分式的第 i 个项。

原文地址:https://www.cnblogs.com/wizzhangquan/p/4375603.html