用递归求第n个斐波那契数
斐波那契数是形如:1,1,2,3,5,8,13,21,34,55,89,144,........
第一第二项是1,第三项是前两项的和1+1=2,第四项是第二第三项的和1+2=3,所以第n项是第n-1项与n-2项的和。
首先要明确,递归是一种算法,它可以是方法自己调用自己,也可以是方法调用其他方法,其他方法又回调方法自己。同时一定要控制好终止,否则会出现递归死循环,导致栈内存溢出错误。
回到案例中:
1、首先设计的递归方法中的计算要满足斐波那契数的数学计算规则,即第n项是第n-1项与n-2项的和,和第一项和第二项是1。
那么也就有了最基本的思路,首先方法中要想办法给第一项和第二项设置为固定值1,同时满足要求得的第n个数等于(n - 1) + ( n - 2),那么不妨设定为将方法接收的参数为int类型的n,n让用户来输入,返回值设置为int,直接返回计算得到的值。
2、如何调用递归?
前面提到了斐波那契数中第一个和第二个数固定为1,而后面的数列中的数又都是该数的前两个数相加得到的,那么不妨就将第一个和第二个数作为递归开始返回的地方。
举例子:
求第5个斐波那契数
递归思路:第5个数需要第4个和第3个数相加,而第4个数又需要第3个数和第2个数相加,第三个数又又需要第2个数和第1个数相加...以此类推,第2个数和第1个数固定为1,那么最下层的递归就可以根据第1个和第2个数层层向上计算,所以这两个数就可以作为递归返回的位置。
如图:
3、代码实现
import java.util.Scanner;
public class Test2_1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请选择要求第几个斐波那契数:");
int choose = sc.nextInt();
System.out.println(getNumber(choose));
}
public static int getNumber(int n) {
//判断本次递归传入的n是否是第1个或第2个
if (n == 1 || n == 2) {
return 1;
}
return getNumber(n - 1) + getNumber(n - 2);
}
}
递归方法getNumber中的 if (n == 1 || n == 2)
用来判断本次递归传入的n是否是第1个或第2个,如果是,那么直接返回1。
在未递归到第1、第2个数时,方法会直接执行
return getNumber(n - 1) + getNumber(n - 2);
以此来调用方法自己。
在一层层递归形成之后,一旦递归到最后的第1、第2个数时,便不会再执行调用方法自己的语句,直接返回数值,此时一层层的递归便开始一边根据下面返回的数值计算,一边将计算得到的数值返回上一层,最终返回要求得的数。
注:此案例主要意在理解递归的思路和过程,实际的斐波那契数计算要是用本案例展示的代码计算的话,很容易超过int的长度而变成负数,且时间冗长(doge