剑指offer (9) 递归和迭代 斐波那契数列

通常基于递归实现的代码比基于循环实现的代码要简洁很多

比如 二叉树遍历以及 二叉树的许多操作

递归由于是函数调用自身,每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量

而每个进程的栈容量是有限的,当递归调用的层级太多时,就会导致 调用栈溢出

递归有时伴随大量重复的计算, 二叉树遍历的递归操作不存在重复计算,因为每个结点的左右子树是严格区分开的

例如求解 斐波那契数列:

解题分析


 int fib(int n) {
assert(n >= 0);
int prevTwo = 0;
int prevOne = 1;
int cur = 1;
for (int i = 1; i <= n; ++i) {
prevOne = cur;
cur = prevOne + prevTwo;
prevTwo = prevOne;
}
return cur;
}

int fib(int n) {
assert(n >= 0);
double s = sqrt(5);
return floor((pow((1+s)/2, n+1) - pow((1-s)/2, n+1)) / s);
}

相关题目:

用 2×1 的小矩形横着或者竖着 去覆盖 更大矩形

例如:用 8个 2×1的小矩形 无重叠覆盖 2×8的大矩形

我们将 2×n的覆盖方法表示为 f(n)

用第一个2×1小矩形去 覆盖最左边时有两个选择:

横着:两个 2×1横着放,这样就剩下 2×(n-2)待覆盖 ,即 f(n-2)

竖着:一个 2×1竖着放,这样就剩下 2×(n-1)待覆盖,即 f(n-1)

即 f(n) = f(n-2) + f(n-1) ,且 f(0) = 0, f(1) = 1 , f(2) = 2

剑指offer (9) 递归和迭代 斐波那契数列,布布扣,bubuko.com

时间: 2024-10-13 22:33:30

剑指offer (9) 递归和迭代 斐波那契数列的相关文章

剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)

递归与循环 递归:在一个函数的内部调用这个函数. 本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算) 优点:简洁,易于实现. 缺点:时间和空间消耗严重,如果递归调用的层级太多,就会超出栈容量. 循环:通过设置计算的初始值及终止条件,在一个范围内重复运算. 斐波拉契数列 题目一:写一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项,定义如下: 第一种解法:用递归的算法: long long Fabonacci(unsigned int n) { i

用递归法计算斐波那契数列的第n项

   斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了<斐波纳契数列>季刊,专门刊载这方面的研究成果. [Fibonacci.cpp] #include<iostream>#

使用递归,计算斐波那契数列

使用递归,计算斐波那契数列 function fib(num) { if (num > 2) { return fib(num - 2) + fib(num - 1); } else { return 1; } } fib(6) 运行过程 1. return fib(4)+fib(5) 2.return fib(2)+fib(3)+fib(3)+fib(4) 3.return 1+fib(1)+fib(2)+fib(1)+fib(2)+fib(2)+fib(3) 4.return 1+1+1+1

递归总结及斐波那契数列的实现

优点:递归给某些编程问题提供了简单的方法 缺点:有缺陷的递归会很快耗尽计算机的资源,递归的程序难以理解和维护 杀毒软件会全盘扫描文件,其中就应用了递归 斐波那契数列的实现如下 #include<stdio.h> int fib(int n) { if(n == 1) return 1; if(n == 2) return 2; if(n > 2) //此行可省略 return fib(n - 1) + fib(n - 2); //返回第三个数 ,有返回值不能用void } int mai

递归思想之---斐波拉契数列

斐波那契数列中的递归思想 ??如果上述的分析都明白了,那就说明你已掌握了递归,但为了加深对递归的理解,我们再来看一个思考题(来自程序员的数学思考题),题目是这样的,假如动物中有一种特殊的种类,它出生2天后就开始以每天1只的速度繁殖后代.假设第1天,有1只这样的动物(该动物刚出生,从第3天开始繁殖后代).那么到第11天,共有多少只呢? 我们先来按一般顺序思考,先不要考虑第11天,先从第1天开始,看能不能找出规律: [第1天]只有1只动物 [第2天]只有1只动物,还没有繁殖后代,总量为1 [第3天]

递归练习之斐波那契数列

/********************************************************************************* Copyright (C), 1988-1999, drvivermonkey. Co., Ltd. File name: Author: Driver Monkey Version: Mail:[email protected] qq:196568501 Date: 2014.04.02 Description: 递归练习之阶乘运

下午学了递归,先是斐波那契数列

#include<stdio.h>int zhd(int n){ if(n==1||n==2)     return 1; else    return zhd(n-1)+zhd(n-2);    }int main(){ int n; scanf("%d",&n); printf("%d",zhd(n)); return 0;\}

剑指offer编程题Java实现——面试题9斐波那契数列

题目:写一个函数,输入n,求斐波那契数列的第n项. 1 package Solution; 2 3 /** 4 * 剑指offer面试题9:斐波那契数列 5 * 题目:写一个函数,输入n,求斐波那契数列的第n项. 6 * 0, n=1 7 * 斐波那契数列定义如下:f(n)= 1, n=2 8 * f(n-1)+f(n-2), n>2 9 * @author GL 10 * 11 */ 12 public class No9Fibonacci { 13 14 public static void

关于斐波那契数列和递归

递归有三个基本点: 1.递归总有一个最简单的情况.即边界或者跳出递归的条件语句: 2.递归总是尝试解决一个规模更小的问题: 3.递归尝试解决的父问题和子问题之间不因该有交集: 以下是几个递归代码://斐波那契数列 import edu.princeton.cs.algs4.StdOut; public class No_1_1_19 { public static void main(String[] args) { for(int n=0;n<10;n++) { StdOut.println(