计算示例——递归与迭代

题目源于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} Fib(n)=(φnψn)/5
n = 0 n=0 n=0
( φ 0 − ψ 0 ) / 5 = F i b ( 0 ) = 0 (\varphi ^0-\psi ^0)/\sqrt{5}=Fib(0)=0 (φ0ψ0)/5 =Fib(0)=0
n = 1 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 (φ1ψ1)/5 =(21+5 215 )/5 =Fib(1)=1
命题成立。
假设 n = k − 2 n=k-2 n=k2 n = k − 1 n=k-1 n=k1 时,命题成立。则 n = k 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 ]/\sqrt5=(\varphi ^{k-2}(1+\varphi)-\psi ^{k-2}(1+\psi ))/\sqrt5 Fib(k)=Fib(k1)+Fib(k2)=[(φk1ψk1)+(φk2ψk2)]/5 =(φk2(1+φ)ψk2(1+ψ))/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+φ=1+21+5 =23+5 =(21+5 )2=φ2
同理,可证
1 + ψ = ψ 2 1+\psi=\psi^2 1+ψ=ψ2
因此,有
F i b ( k ) = ( φ k − ψ k ) / 5 Fib(k) = (\varphi ^k-\psi ^k)/\sqrt{5} Fib(k)=(φkψk)/5
故,命题得证。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值