递归求解斐波那契fib(10)一共调用了多少次fib()函数

定义fib()如下:

int fib(int n)
    {
        count ++;
        if (n==0)
            return 1;
        else if (n==1)
            return 1;
        else
            return fib(n-1) + fib(n-2);
    }

由原来fib的地推公式得出求解次数的地推公式。

那么Count(fib(10)) = count(fib(9))  + count(fib(8)) + 1;

求解count( fib(n) ) 的次数,就是计算fib(n)递归树(是一个二叉树),叶子结点的个数。

count( fib(0) ) = 1

count( fib(1) ) = 1

count( fib(2) ) = count ( fib(1) ) + count( fib(0) )  + 1 = 3

count( fib(3) ) = count ( fib(2) ) + count( fib(1) )  + 1 = 3+1+1 = 5

这个样子计算的还是很快的

fib(10),一共调用了 177次。

其实上面是360的一道面试题

时间: 2024-07-29 00:04:41

递归求解斐波那契fib(10)一共调用了多少次fib()函数的相关文章

谨慎地使用递归之斐波那契递归实现的分析

[斐波那契函数的定义] 斐波那契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=1,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*). [用递归求解斐波那契函数的弊端] 斐波那契函数用递归实现如下面的代码: 计算斐波那契的自然递归程序效率时很低的,上面的程序虽然写法简单,看上去时递归的聪明的使用,但其实效率是及其低下的.特别是当n=40以后,效率衰减的特别明显.为了计算 fib( n ) ,

几年前做家教写的C教程(之三专讲了递归和斐波那契)

C语言学习宝典(3) 数组: 一维数组的定义: 类型说明符  数组名[常量表达式] 例如: int  a[10]; 说明:(1)数组名的命名规则和变量名相同,遵循标示符命名规则 (2)在定义数组时需要指定数组个数,即数组长度 (3)变量表达式中可以包括常量和符号常量,不能包含变量. 一维数组的应用:  数组名[下标] 一维数组的初始化:(1)在定义数组时对数组元素赋予初值 Int a[10]={0,1,2,3,4,5,6,7,8,9} (2)可以只给一部分元素赋值 Int a[10]={0,1,

13、蛤蟆的数据结构笔记之十三栈的应用之栈与递归之斐波那契数列

13.蛤蟆的数据结构笔记之十三栈的应用之栈与递归之斐波那契数列 本篇名言:"人生不是一支短短的蜡烛,而是一支由我们暂时拿着的火炬,我们一定要把它燃得." 继续递归的斐波那契数列问题. 欢迎转载,转载请标明出处: 1.  斐波那契数列 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学

249 递归:概念,利用递归求1~n的阶乘,利用递归求斐波那契数列,利用递归遍历数据

6.1什么是递归 递归:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数. 简单理解: 函数内部自己调用自己, 这个函数就是递归函数 注意:递归函数的作用和循环效果一样,由于递归很容易发生"栈溢出"错误(stack overflow),所以必须要加退出条件return. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"&g

还在用递归实现斐波那契数列,面试官一定会鄙视你到死

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368...... 我记得在初学C语言的时候,大学老师经常会讲一些常见的数学问题及递归的使用,其中斐波那契数列就是一定会被拿出来举例的.在后来工作中,面试做面试题的时候,也很大概率会出现编写算法实现斐波那契额数列求值.可以说,在我们编程道路上,编写算法实现斐波那契数列是

递归与斐波那契数列

一.递归 在函数内部,可以调用其他函数;如果一个函数在内部调用自己,那这个函数就是递归函数. 案例:遍历当前目录下的所有文件 1.递归遍历 1 import os 2 def gci(filepath): 3 #遍历filepath下所有文件,包括子目录 4 files = os.listdir(filepath) 5 for fi in files: 6 fi_d = os.path.join(filepath,fi) 7 if os.path.isdir(fi_d): 8 gci(fi_d)

Python递归及斐波那契数列

递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可以看出:fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n所以,fact(n)可以表示为 n * fact(n-1),只有n=1时需要特殊处理.于是,fact(n)用递归的方式写出来就是: def fact(

递归之斐波那契数列

在数学上,費波那契數列是以递归的方法來定义: (n≧2) 用文字來说,就是斐波那契数列由0和1开始,之後的斐波那契数列就由之前的兩数相加. 这也是从维基百科上摘来的表述,比较的专业点.那个简单的写一下前面的几个是: 0,1,1,2,3,5,8,13,21,34,55,89,144,233...... 这个也是成一个指数增长的现象,所以兔子要是都按这个节奏生长,那就天天有肉吃了,还便宜!!! 这个问题相对与汉诺塔问题,较我而且,斐波那契数列一目了然,比较的好理解. 下面就用Ptyhon来实现一下:

求解斐波那契数列的第n项

对于Fibonacci数列,1,1,2,3,5,8,12,...求解第n项值,我们通常用的是递归算法,即递推式f(n) = f(n-1)+f(n-2).然而这其实是一种效率极低的算法,当n达到41时,就已经需要1s左右,随着n的增加,时间是指数级增长的. 因为该递归算法有太多的重复计算,如下图所示,所用时间T(n) = T(n-1)+T(n-2)+Θ(1),可以知道T(n)有Ω((3/2)n)的下界,T(n)<O(2^n),可以看到这是指数级的时间复杂度. 具体代码实现如下: Elemtype