递归把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量,所以递归是必须要掌握滴。在使用递归时,主要把握递归的方向——边界在哪里?要向着已知方向递归,不然就成了无穷递归,类似死循环!!!
1.一百之间所有数的和
思路:
求1-100的和,先求1-99的和再加上100…求1-2的和,1的和就是1咯,这个1就是边界。
public int sum(int num){
if(num == 1){
return 1;
} else {
return num + sum(num - 1);
}
}
2.数列问题
已知有一个数列:f(0)=1,f(1)=4;f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值。
看到这个感觉回到了高中数学,无非就是把题目条件转换为计算机语言。
思路:
题目已经给出边界条件了,当n=0时,f(0)=1,当n=1时,f(1)=4;用一个代换即可将后面的式子转换为:f(n)=2*f(n-1)+f(n-2)。
public class Test {
public static void main(String[] args) {
System.out.println(f(10));
}
public static int f(int n) {
if (n == 0) {
return 1;
} else if (n == 1) {
return 4;
} else {
return 2 * f(n - 1) + f(n - 2);
}
}
}
3.斐波那契数列
输入一个数n,计算斐波那契数列的第n个值1 1 2 3 5 8 13 21 34 55
规律:一个数等于前两个数之和
要求:计算第n个值并打印
思路和上面类似。
package test;
public class Test {
public static void main(String[] args) {
System.out.println(f(10));
}
public static int f(int n) {
if (n == 1) {
return 1;
} else if (n == 2) {
return 1;
} else {
return f(n - 1) + f(n - 2);
}
}
}
4.N阶台阶问题
N阶台阶,一次只能上一阶或者二阶,求上去的所有走法
思路: n等于1只有一种走法,n=2有两种走法。求第n阶,可以从n-1直接一步上去,也可以从n-2两步上去(一步一步走,则与n-1重合了一种),所以f(n)=f(n-1)+f(n-2);
package test;
public class Test {
public static void main(String[] args) {
System.out.println(f(4));
}
public static int f(int n) {
if (n == 1) {
return 1;
} else if (n == 2) {
return 2;
} else {
return f(n - 1) + f(n - 2);
}
}
}
快速排序也用到了递归策略,请查看前面有关数组的博文,最后一个。