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.