计算示例——递归与迭代

题目源于SICP。

第一题
在这里插入图片描述
python实现

# recursive process
def f(n):
	if n < 3:
		return n
	else:
		return f(n-1) + 2*f(n-2) + 3*f(n-3)

# iterative process
def f(n):
	if n < 0:
		return n
	else:
		a, b, c = 0, 1, 2
		for i in range(n):
			a, b, c = b, c, 3*a + 2*b + c
		return a

scheme实现

递归版本

(define (f n)
  (cond ((< n 3) n)
        (else (+ (* 3 (f (- n 3)))
                 (* 2 (f (- n 2)))
                 (f (- n 1))))))

迭代版本

(define (f-iter a b c n)
  (cond ((< n 0) n)
        ((= n 0) a)
        (else (f-iter b c (+ (* 3 a)
                        (* 2 b)
                        c)
                 (- n 1)))))

(define (f n)
  (f-iter 0 1 2 n))

用python实现一个计算过程实在太接近人类的思考过程了。简直就像是数学定义重新写一遍。所以先用python实现,然后再写其他语言实现使非常方便的。
在这里插入图片描述

在这里插入图片描述
python实现

def pascalTriangle(r, c):
	if r < c or c <= 0:
		raise Exception
	elif r == c or c == 1:
		return 1
	else:
		return pascalTriangle(r-1, c-1) + pascalTriangle(r-1, c)

scheme实现

(define (pascal-triangle r c)
  (cond ((or (= r c) (= c 1)) 1)
        ((or (< r c) (< c 0) (= c 0)) -1)
        (else (+ (pascal-triangle (- r 1) (- c 1))
                 (pascal-triangle (- r 1) c)))))

在这里插入图片描述
首先,Fibonacci numbers的实现如下
python实现

# recursive process
def fib(n):
	if n == 0:
		return 0
	elif n == 1:
		return 1
	else:
		return fib(n-1) + fib(n-2)
#iterative process
def fib(n):
	a, b = 0, 1
	for i in range(n):
		a, b = b, a+b
	return a

scheme实现

recursive process

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))
iterative process

(define (fib n)
  (define (fib-iter a b count)
    (cond ((= count 0) a)
          (else (fib-iter b (+ a b) (- count 1)))))
  (fib-iter 0 1 n))

首先证明: F i b ( n ) = ( φ n ψ n ) / 5 Fib(n) = (\varphi ^n-\psi ^n)/\sqrt{5}
n = 0 n=0
( φ 0 ψ 0 ) / 5 = F i b ( 0 ) = 0 (\varphi ^0-\psi ^0)/\sqrt{5}=Fib(0)=0
n = 1 n=1
( φ 1 ψ 1 ) / 5 = ( 1 + 5 2 1 5 2 ) / 5 = F i b ( 1 ) = 1 (\varphi ^1-\psi ^1)/\sqrt{5}=(\frac{1+\sqrt{5}}{2}-\frac{1-\sqrt{5}}{2})/\sqrt{5}=Fib(1)=1
命题成立。
假设 n = k 2 n=k-2 n = k 1 n=k-1 时,命题成立。则 n = k n=k 时,有
F i b ( k ) = F i b ( k 1 ) + F i b ( k 2 ) = [ ( φ k 1 ψ k 1 ) + ( φ k 2 ψ k 2 ) ] / ( 5 ) = ( φ k 2 ( 1 + φ ) ψ k 2 ( 1 + ψ ) ) / ( 5 ) Fib(k)=Fib(k-1)+Fib(k-2)=\left [(\varphi ^{k-1}-\psi ^{k-1})+(\varphi ^{k-2}-\psi ^{k-2}) \right ]/\sqrt(5)=(\varphi ^{k-2}(1+\varphi)-\psi ^{k-2}(1+\psi ))/\sqrt(5)
其中
1 + φ = 1 + 1 + 5 2 = 3 + 5 2 = ( 1 + 5 2 ) 2 = φ 2 1+\varphi=1+\frac{1+\sqrt{5}}{2}=\frac{3+\sqrt{5}}{2}=(\frac{1+\sqrt{5}}{2})^2=\varphi^2
同理,可证
1 + ψ = ψ 2 1+\psi=\psi^2
因此,有
F i b ( k ) = ( φ k ψ k ) / 5 Fib(k) = (\varphi ^k-\psi ^k)/\sqrt{5}
故,命题得证。

要证 F i b ( n ) Fib(n) 是最接近 φ n / ( 5 ) \varphi^n/\sqrt(5) 的整数,即证
F i b ( n ) φ n / ( 5 ) < 1 2 |Fib(n)-\varphi^n/\sqrt(5)|<\frac{1}{2}
其中
F i b ( n ) φ n / ( 5 ) = ψ n / ( 5 ) = ψ n / ( 5 ) |Fib(n)-\varphi^n/\sqrt(5)|=|\psi^n/\sqrt(5)|=|\psi|^n/\sqrt(5)
因为, ψ = 1 5 2 |\psi|=|\frac{1-\sqrt{5}}{2}| ,所以 0 < ψ < 1 0<|\psi|<1
ψ n / ( 5 ) < 1 / ( 5 ) < 1 2 |\psi|^n/\sqrt(5)<1/\sqrt(5)<\frac{1}{2}
故命题得证。

原创文章 6 获赞 4 访问量 632

猜你喜欢

转载自blog.csdn.net/zhakngye/article/details/105882452