日期:2014-05-20  浏览次数:20610 次

java写的fibnacci数列,求第n位数和1-n位数的和。有地方不懂。
import java.util.Scanner;
public class F{
    private static int s;
    private static int sum=0;//存放n位数的和
    public static int Fib(int n){
     if(n==1){
         s=1;
         sum=1;
        }
     else if(n==2){
         s=1;
         sum=2;
     }
     else {
             s=Fib(n-2)+Fib(n-1);//递归
             sum=sum+s;//求和
         }
     return s;
  }
    public  static void main(String args[]) {
        Scanner sc = new Scanner(System.in);//从控制台输入数据
        int p = sc.nextInt();
        System.out.println(Fib(p));//输出第n位数是多少
        System.out.print(sum);//输出前n位数的和
     }

}

为什么改s=Fib(n-2)+Fib(n-1)成为s=Fib(n-1)+Fib(n-2)的时候,求和的时候出错了,求n位数没有错。求高人看下,谢谢!

------解决方案--------------------
太高深了,给你一个更简单的能达到同样效果的代码。
public class FibNumber {
     static int f(int n) {
         int s;
        if(n==1
------解决方案--------------------
n==2) {
            return s=1;
        } else {
            return s=f(n-2)+f(n-1);
        }
    }

    public static void main(String[] args) {
        int sum =0;
        for(int i=1;i<=10;i++) {
            sum+=f(i);
        }
        System.out.println(f(10));
        System.out.println(sum);
    }
}
------解决方案--------------------

s = Fib(n - 2) + Fib(n - 1);//递归 

关键是这句执行完后,得到的sum 值是对的。而

s = Fib(n - 1) + Fib(n - 2) ;// 递归

执行完后,sum 值是错的。
当n<=2时,没有影响,而当n>=3 时,会执行到上面的递归语句。 假设n=3, 按上面第一种写法的语句,Fib(3-2) + Fib(3-1) 即 Fib(1) + Fib(2), Fib(1) 执行完,sum = 1, 而Fib(2) 执行完,sum = 2. 最终sum = 2. 这就对了。sum = sum(第n-1) + s.
而第二种写法的语句,Fib(3-1) + Fib(3-2) 即 Fib(2) + Fib(1), Fib(2) 执行完 sum = 2, 而Fib(1) 执行完, sum = 1. 最终 sum = 1. 这就出错了。 在递归体里,这个求和的公式相当于 当前数与前第二个数的和(或者说相当于 sum = sum(第n-2) + s.