递归
一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
构成递归需具备的条件:
- 子问题须与原始问题为同样的事,且更为简单;
- 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
递归求阶乘
public static int factorial(int n) {
if(n>0){
if (n==1) {
return 1;
}
if (n>1) {
/*
n*(n-1)*((n-1)-1)*...*1
*/
return n*factorial(n-1);
}
}
return -1;
}
分析:
当求1的阶乘,即n=1时,返回一个1
当n=2时,返回21
当n=3时,返回321
当n=4时,返回4321
…
当n=n时,返回n*(n-1)((n-1)-1)…*1 (直到n=1)
递归求斐波那契数列
斐波那契数列:1 1 2 3 5 8 13 21 34…
不难发现规律是,前两个数为1,后面的每一个数为它的前两位数之和
public static int fibonacci(int n) {
if (n>0) {
if (n==1||n==2) {
return 1;
}else{
return fibonacci(n-1)+fibonacci(n-2);
}
}else{
return -1;
}
}
可以尝试写汉诺塔练习递归,因为它相比这两个小白比较难理解,我准备单独写一个帖子对它进行一个较为详细的描述。