A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Cancer 中级黑马   /  2015-8-20 10:26  /  4480 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
求斐波那契数列第n项,n<30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55
public class Test4 {

public static void main(String[] args) {
int n;
int fn;
Scanner scanner=new Scanner(System.in);
System.err.println("请输入30以内的整数:");
n=scanner.nextInt();
fn=peibo(n);
System.out.println("斐波那契数列第"+n+"项为:"+fn);
}

public static int peibo(int n){
if(n==1 || n==2){
return 1;
}
//         System.err.println(peibo(n-1)+peibo(n-2)+" n="+n);
return peibo(n-1)+peibo(n-2);
}
}
求打码运行原理,求讲解

最佳答案

11 个回复

倒序浏览
本帖最后由 夸克 于 2015-8-21 05:32 编辑
  1. /**
  2. * 需求:求斐波那契数列第n项,n<30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55
  3. * 思路:不知道这段代码你从哪儿找的,你的问题也不是很清楚,就当你是初学者了
  4. *            斐波那契数列是一组有规律的数列,很有名可以百度下,基本规律就是从第三项开始,值等于前两项之和
  5. *            如:2=1+1,3=1+2,5=2+3.......
  6. *            数学上我们学过通项公式吧,就是用字母代表数列变化规律的,F(n)就表示这个数列的第n项值。
  7. *            那比如设第n项值为F(n),根据 他的规律,他必然等于前两项的和,即F(n)=F(n-1)+F(n-2)
  8. *            
  9. *            这断代码中前半部分涉及到IO流,就是个固定格式,等你学了就理解了。
  10. * */
  11. import java.util.Scanner;
  12. //求斐波那契数列第n项,n<30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55
  13. public class Test1
  14. {

  15.         public static void main(String[] args)
  16.         {
  17.                         //代表要求的第n项数字
  18.                      int n;
  19.                      //代表第n项的值
  20.                      int fn;
  21.                     //这句话是获取键盘输入的值
  22.                         Scanner scanner=new Scanner(System.in);
  23.                         //打印函数,提示输入
  24.                         System.err.println("请输入30以内的整数:");
  25.                         //调用Scanner的方法,获取输入的整数值
  26.                         //这里可以加判断语句,确保输入的数值符合条件
  27.                         n=scanner.nextInt();
  28.                         //调用我们写的peibo函数,得到第n项值
  29.                         fn=peibo(n);
  30.                         System.out.println("斐波那契数列第"+n+"项为:"+fn);
  31.         }
  32. //这里是我们定义的求第n项值的函数
  33.                 public static int peibo(int n)
  34.           {
  35.                 //这里其实就是数学上根据规律关系和特殊值项求通项公式
  36.                 //这里判断有两个作用,如果你输入的数字是1或者2时,直接返回1不需要进行后边的语句,避免n-1或n-2发生异常
  37.                 //再就是为递归提供出口        
  38.                 if(n==1 || n==2)
  39.                             {
  40.                             return 1;
  41.                         }
  42. /*
  43.         在函数中调用自身函数,在编程中就称作递归。
  44.         运行到这里说明输入的值不是1或者2,那么就会运行下边return语句。
  45.     从逻辑上,return返回值即这个函数的返回值peibo(n-1)+pei(n-2)=peibo(n),符合我们在思路中说的规律。
  46.     具体流程见下图
  47. */        
  48.                 else
  49.               return peibo(n-1)+peibo(n-2);
  50.            }

  51. }
复制代码

回复 使用道具 举报
你的代码可以写成这样,你就明白了
  1.                  public static int fibonacciNormal(int n){
  2.                         if(n <= 2){
  3.                             return 1;
  4.                         }
  5.                         int n1 = 1, n2 = 1, sn = 0;
  6.                         for(int i = 0; i < n - 2; i ++){
  7.                             sn = n1 + n2;
  8.                             n1 = n2;
  9.                             n2 = sn;
  10.                         }
  11.                         return sn;
  12.                     }
  13.                 }
复制代码
回复 使用道具 举报
哪里不懂··· ? 递归懂吗?
递归懂就应该没问题
回复 使用道具 举报
这题主要还是递归上
回复 使用道具 举报
public static void main(String[] args) {
int n;  //声明存储控制台输入的数值变量
int fn;//声明存储运算结果的变量
Scanner scanner=new Scanner(System.in); //从控制台接受键盘录入
System.err.println("请输入30以内的整数:");//控制台显示提示操作的字符
n=scanner.nextInt();//读入控制台录入的数并存放到变量n
fn=peibo(n);//调用斐波那契第n项的运算方法
System.out.println("斐波那契数列第"+n+"项为:"+fn);//打印输出运算结果
}
/*
*斐波那契数列是第三项等于他前两项的和,即Fn+2=Fn + Fn+1(n>=0)
*下面的方法运用了递归,递归简单来讲就是在方法体内调用自身方法
*举个例子:假如在这个方法里你输入的是5,第一步判断5是否等于1或2,不等于则执行到 peibo(n-1)+peibo(n-2);
*peibo(n-1),调用自身方法又回到这个方法起始位置重新判n-1是否满足等于1或2,紧接着又开始下一轮循环,直到满足了n==1或n==2时返回1,循环结束。同样peibo(n-2)执行同样的操作。
*最后的结果就是:
*Peibo(5)
*peibo(4)+peibo(3)
*peibo(3)+peibo(2)+peibo(2)+peibo(1)
*peibo(2)+peibo(1)+peibo(2)+peibo(2)+peibo(1)
即:1+1+1+1+1=5
*/

public static int peibo(int n){
if(n==1 || n==2){
return 1;
}
//         System.err.println(peibo(n-1)+peibo(n-2)+" n="+n);
return peibo(n-1)+peibo(n-2);
}
}
回复 使用道具 举报
Cancer 中级黑马 2015-8-21 08:50:40
7#
回复 使用道具 举报
夸克 中级黑马 2015-8-21 14:00:12
8#

不客气,这个在毕向东老师的基础视频里都有讲,在靠后变的递归部分,老师讲的详细多了
回复 使用道具 举报
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
回复 使用道具 举报
递归 啊、 从第三项开始前两个的和等于第三个数啊
回复 使用道具 举报
柳柳桑 发表于 2015-8-20 11:33
你的代码可以写成这样,你就明白了

没想到管理员也是技术大神
回复 使用道具 举报
月影千华 来自手机 中级黑马 2015-9-12 02:12:53
12#
手机写的,将就看下
long m1,m2;
int m;
m1=m2=1L;
m是1-2的情况
m1=m2=1;
m是3及以上的情况
m2=m2+m1;
m1=m2-m1;
打印出m2就可以了。
代码请自己根据思路写哈。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马