4. 斐波那契数列的第一个和第二个数分别为1和1,从第三个数开始,每个数等于其前两个数之和(1,1,2,3,5,8,13…………).编写一个程序输出斐波那契数列中的前20个数。要求每行输出5个。
使用递归实现,我看了一下别人的代码,但是不知道程序是如何运行的,麻烦高人解释一下,感谢啊! package com.accp.zp; import java.util.*; public class TsetArgs {
 public static void main(String[] args) {
 System.out.print(f(5)+" ");
 } public static int f(int n) {
 if (n == 1 || n == 2) {
 return 1;
 } else {
 return f(n - 1) + f(n - 2);
 }
 }
 }

解决方案 »

  1.   

    通俗理解: 当n很小时,可以直接知道结果(如“ if (n == 1 || n == 2) { return 1; } ”),当n很大时,需要知道n前面的结果,如f(n-2)与f(n-1),才能计算出f(n)这时就该考虑用递归算法了。记住递归有两个特点:第一必须有出口,也就是限定条件,如“ if (n == 1 || n == 2)  return 1;”第二方法必须调用自身。如“return f(n - 1) + f(n - 2);”这只是一种算法,对于所有语言都是一样道理的,和Java没有关系。把这个程序当成例题,遇到类似的情况会套用就行了!good luck!!!
      

  2.   

    f(5) = f(4) + f(3)
         = f(3)+f(2) + f(2)+f(1)
         = f(2)+f(1)+f(1)+f(0)+f(1)+f(0)+f(1)
         =f(1)+f(0)+f(1)+f(1)+f(0)+f(1)+f(0)+f(1)=8
      

  3.   


    package com.accp.zp; import java.util.*; public class TsetArgs {
     public static void main(String[] args) {
     1、System.out.print(f(5)+" ");
     } public static int f(int n) {
     2、if (n == 1 || n == 2) {
     return 1;
     3、} else {
     4、return f(n - 1) + f(n - 2);
     }
     }
     }上面标号是程序的执行顺序,1是程序入口,然后调用f函数,将参数5传进去。执行2,因为n不为1也不为2,跳转到else,然后执行4分别计算f(4)---f(3)(将4,3作为参数传给f函数)--f(2)--f(1)(n=1或2返回1,即f(1)=f(2)=1),根据f(1)、f(2)的值分别计算出f(4)f(3),最好计算出f(5)!
      

  4.   

    int[] a=new int[20];
    a[0]=1;
    a[1]=1;
    int j=0;
    for(int i=2;i<a.length;i++){
    a[i]=a[i-1]+a[i-2];
    }
    for(int i=0;i<a.length;i++){
    System.out.print(a[i]+"  ");
    j++;
    if(j%5==0){
    System.out.println();
    }
    }
      

  5.   

    给你用数组求斐波那契数列的列子希望能对LZ有帮助
    int[] a = new int[10];
    a[0] = 1;
    a[1] = 1;
    for(int i = 2 ; i <= a.length - 1 ; i ++){
    a[i] = a[i-2] + a[i - 1];
    }
    for(int b : a){
    System.out.print(b + "\t");
    }