递归的概念
一个方法在执行过程中调用自身, 就称为 “递归”.
递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.
例如, 我们求 N!
起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.
递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!
递归的必要条件:
- 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
- 递归出口
案例一:递归求N的阶乘
public static int diGui(int N){
if(N==1){
return N;
}
return N*diGui(N-1);
}
public static void main(String[] args) {
int ret=diGui(5);
System.out.println(ret);
}
递归过程分析
以求n的阶乘为例
- 递归先递再归
递归练习
练习一: 递归求每位数字和
写一个递归方法,输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回 1+7+2+9,它的和是19
public static int func(int a){
if(a<10){
return a;
}
return a%10+func(a/10);
}
public static void main(String[] args) {
System.out.println(func(1716));//19
}
练习二: 求斐波那契数列的第 N 项
//方法一:递归
public static int feiBo(int a){
if(a<=2){
return 1;
}
return feiBo(a-1)+feiBo(a-2);
}
public static void main(String[] args) {
System.out.println(feiBo(10));//55
}
//方法二:循环
public static int feiBo2(int n){
int a=1;
int b=1;
int c=1;
while(n>2){
c=a+b;
a=b;
b=c;
n--;
}
return c;
}
public static void main(String[] args) {
System.out.println(feiBo210));//55
}