SICP 1.2.2 树形递归 (斐波那契数)

Posted ...............洋葱的秋秋空间........

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SICP 1.2.2 树形递归 (斐波那契数)相关的知识,希望对你有一定的参考价值。

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

树形递归:计算步骤 随输入 指数性 增长,空间 随输入 线性 增长.

(define (fib n)
(fib-iter 1 0 n))

(define (fib-iter a b count)
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1))))

线性迭代:计算步骤 随输入 线性 增长,空间 随输入 线性 增长.

 

用java写出来看看到底有多厉害:


/**
* Created by Ramble on 2017/11/22.
*/
public class Fib {
public static long digui(long n) {
if (n==0)
return 0;
if (n==1)
return 1;
else {
return digui(n-1)+digui(n-2);
}
}

public static long diedai(long n) {
return diedai_iter(1, 0, n);
}

public static long diedai_iter(long a, long b, long count) {
if (count==0)
return b;
else {
return diedai_iter(a+b, a, count-1);
}
}

public static void main(String[] args) {
long startTime = System.currentTimeMillis();
System.out.println(digui(50L));
// System.out.println(diedai(50L));
long endTime = System.currentTimeMillis();
System.out.println("程序运行时间:"+(endTime-startTime)+"ms");

}
}

在n为50的时候:

树形递归程序运行时间:70805ms

而线性迭代绝大部分时候都是0ms.

(Java里面函数名不允许 - 这个符号)

以上是关于SICP 1.2.2 树形递归 (斐波那契数)的主要内容,如果未能解决你的问题,请参考以下文章

17. 计算斐波那契数(非递归方法)

斐波那契数与二分法的递归与非递归算法及其复杂度分析

[算法学习]斐波那契数计算

使用递归方式和非递归方式求斐波那契数

算法动态规划 - 斐波那契数

斐波那契数列(递归非递归算法)