递归的再一次理解-斐波那契数列

链接:https://www.nowcoder.com/questionTerminal/c6c7742f5ba7442aada113136ddea0c3
来源:牛客网

这个题可以说是迭代(Iteration) VS 递归(Recursion),

f(n) = f(n-1) + f(n-2),第一眼看就是递归啊,简直完美的递归环境,递归肯定很爽,这样想着关键代码两三行就搞定了,注意这题的n是从0开始的:


1

2

if(n<=1) return n;

else return Fibonacci(n-1)+Fibonacci(n-2);

然而并没有什么用,测试用例里肯定准备着一个超大的n来让Stack
Overflow,为什么会溢出?因为重复计算,而且重复的情况还很严重,举个小点的例子,n=4,看看程序怎么跑的:

Fibonacci(4) = Fibonacci(3) + Fibonacci(2);

= Fibonacci(2) + Fibonacci(1) + Fibonacci(1)
+ Fibonacci(0);

= Fibonacci(1) + Fibonacci(0) + Fibonacci(1)
+ Fibonacci(1) + Fibonacci(0);

由于我们的代码并没有记录Fibonacci(1)和Fibonacci(0)的结果,对于程序来说它每次递归都是未知的,因此光是n=4时f(1)就重复计算了3次之多

时间: 2024-10-05 04:44:15

递归的再一次理解-斐波那契数列的相关文章

递归:阶乘、斐波那契数列

阶乘 public static void main(String[] args) { System.out.println(factorial(5));; } //factorial 阶乘 public static long factorial(int n) { if (n == 1) { return 1; } return n*factorial(n-1); } 阶乘画图理解 斐波那契数列递归实现: public static void main(String[] args) { Sys

简述java递归与非递归算法,0-100求和,斐波那契数列,八皇后,汉诺塔问题

一:什么是递归算法? 递归算法就是直接或者间接的调用自己的方法,在达到一个条件的时候停止调用(递归出口),所以一定要找准好条件,让递归停止,否则就会是无限进行下去 二:递归程序设计的关键 1:找出调用中所需要的参数 2:返回的结果 3:递归调用结束的条件 三:递归程序注意 1:要有方法中自己调用自己 2:要有分支结构 3:要有结束的条件 四:简单叙述递归函数的优缺点 优点: 1:简洁清晰,实现容易,可读性好 2:在遍历的算法中,递归比循环更为简单 缺点: 1:效率低,使用递归函数是有空间和时间的

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

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

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

JS 从斐波那契数列浅谈递归

一.前言 昨晚下班后,经理出于兴趣给我们技术组讲了讲算法相关的东西,全程一脸懵逼的听,中途还给我们出了一道比较有趣的爬楼问题,问题如下: 假设一个人从地面开始爬楼梯,规定一步只能爬一坎或者两坎,人只能往上走,例如爬到第一坎,很明显从地面到第一坎只有一种可选方式,从地面爬到第二坎,他可以从地面直接跨到第二坎,也可以先从地面到第一坎,再从第一坎到第二坎,也就是2种可选方式,那么求他爬到N楼一共有几种可选方式. 这道题涉及到了斐波那契数列,要求使用递归来求值,技术贼菜的我也是一脸懵逼,所以本着学习的心

MIT Python 第四课函数抽象与递归简介 最后三分钟递归的经典案例:斐波那契数列

斐波那契数列Fibonacci Sequence,又称黄金分割数列,指的是这样一个数列: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*) 有一对一个月大的一公一母的兔子,再过一个月的时候交配生小兔子,假设它们生的是两只一公一母的小兔子,在下一个月末这两只小兔子也有了后代同样是一公一母,问题是一年后你会有多少只小兔子?[呲牙]第三年的时候就像到了澳大利亚... >>&g

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(

用for循环和递归调用写出1~N的斐波那契数列的和 和第N位的数

首先注意: 代码是从上往下,从左往右执行的!! 这是for循环写的 m=任意数.代表1~多少位的和 public class Fei_Bo_Na_Qi{    public static void main(String[] args){        int m = 30;  //这里代表1~30位的和        System.out.println( "斐波那契数列的第 "+m+" 位数为: "+m1(m) );//  在输出的时候调用函数    }   

递归之斐波那契数列

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