什么是递归?怎么用它来实现斐波那契数列?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是递归?怎么用它来实现斐波那契数列?相关的知识,希望对你有一定的参考价值。

参考技术A

如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。
简单的说 递归就是函数的内部自己调用自己,这个函数就是递归函数。
递归函数不断的一遍又一遍的调用自己,效果类似于循环,同样也和循环有一样的特点,那就是怕死循环。
在递归中叫"栈溢出"错误(stack overflow),所以必须要加退出条件 return。

再来个栗子:

刚开始的我会把fn(n-1)这里写成 n+1 想当然的觉得 1 2 或者 2 3 这样的不也是一样吗 但是执行完发现显示的是栈溢出
到这我才发现我还是不理解递归的返回条件
于是我自己分析了一下:

发现了吗 没有条件的中断与返回 自己觉得就是求一下3的阶乘 但实际求的是从3开始的和3++的阶乘

而写成n-1 求的是从3开始 与3--的阶乘 一直求到有一个中断条件 n==1 返回了1为止
这样的话 可以在上限加一个中断返回值

这样的话 算的就是从2到5的阶乘结果是和n-1那个 fn(5)的值是一样的 值都是120

那么说到递归就自然而然的要说到斐波那契数列(兔子序列)了:
简单的说就是前两项相加的值等于后面那个数的值
1、1、2、3、5、8、13、21......
要求:用户输入一个数字n就可以求出 这个数字对应的兔子序列的值

于是 自恃天才的我 想到了为什么不直接写
renturn fn(n-1)+fn(n)呢?
我输出了一下 又是栈溢出!
现实是啪啪的打脸 玛德制杖 自己推算一下 搜戴斯内...

fn(3)算个没完没了 我们并没有终结它
在这里我用自己的语言 浅显的、简单的总结一下 正确的递归 要有初始值 还要明确结束值 递归的方向也要清楚
递归的方向就是中断的条件 就是结束值的方向 朝着中断的条件总不会错
就如同X轴 Y轴的折线图一样
比如上面那个阶乘 我的n*fn(n+1)的错误在于没有弄清楚方向 让它一直走一个向上的箭头 向上还没有封顶 它自然会栈溢出 。
再比如刚才这个斐波那契数列 我是让它在X轴水平向右无限延伸 水平方向我也没有设置中断 它也会栈溢出
但愿今晚的两杯酒饮料不至于让我在这说胡话 [苦笑]

java用递归编程求斐波那契数列第n项

public class Fibonacci
public static void main(String args[])
int n,fn;//n为第n项,fn为第n项的值
java.util.Scanner s = new Scanner(System.in);
n=s.nextInt();
fn=function(n);
System.out.println("斐波那契数列第"+n+"项为:"+fn);


public static int function(int n)
if(n==1 || n==2) return 1;
return function(n-1)+function(n-2);



希望能帮到你,其实和c语言是一样一样的。。
参考技术A 套数学里的就是了 f(0) = 1, f(1) = 1, f(2) = 2, ...

int fib(int i)
if( i < 2 ) return 1; // 递归结束的条件

return f(i -1) + f(i-2);

参考技术B import java.io.*;
public class Zhidao1
public static void main(String[] args)
Zhidao1 z1=new Zhidao1();
int n;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入要求的数是第几个数:");
try
String str=br.readLine();
n=Integer.parseInt(str);
System.out.println("第"+n+"个斐波那契数是:\n"+z1.getFib(n));
catch (Exception e)
e.printStackTrace();


public long getFib(int n)

long fn;
if(n==1||n==2)
fn=1;
else
fn=getFib(n-1)+getFib(n-2);
return fn;

参考技术C 这样做,从内存上来说,深层次的递归容易造成栈溢出,我推荐这种

public static void main(String[] args)
int i=1;
int t=1;
for(int s=0;s<10;s++)
System.out.println(i);
if(s>0)
i += t;
t = i-t;


参考技术D  public class Test
  public static void main(String args[])
  int x1 = 1;
  int sum = 0;
  int n = 7;
  for (int i = 1; i <= n; i++)
  x1 = func(i);
  sum = sum + x1;
  
  System.out.println("sum=" + sum);
  
  public static int func(int x)
if (x > 2)
//返回前两个数的和
  return (func(x - 1) + func(x - 2));//返回前两个数的和
  else
  return 1;
  
  

以上是关于什么是递归?怎么用它来实现斐波那契数列?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

编写一递归函数求斐波那契数列的前40项

什么是斐波那契数列?在日常生活中有什么实例?

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

Python 递归实现斐波那契数列