一、什么是递归?
递归简单的概括,就是指在一个方法(函数)的内部调用该方法(函数)自己本身的编程方式。
下面列举一个简单的递归例子
给定一个大于0的目标值,然后通过程序判断,打印出这个目标值所有大于0的数。
public class demo3 {
public static void main(String[] args) {
print(3);
}
//递归
public static void print(int i){
if(i > 0){
System.out.println(i);
print(i-1);
}
}
}
输出结果:
通过以上的例子可以看出,判断程序的 print(int i) 方法的末尾,在方法内部调用了自己本身,也就是说,当给print(int i) 方法传入一个为3的目标值时,第一次进入该方法,判断3是大于0的,满足判断条件,然后打印出3,并减去1,得到2。也就是说,在这个时候的目标值已经由3转换成了2,然后第二次进入判断方法,判断2是大于0的,满足判断条件,然后打印出2,并减去1,得到1,这时,目标值由2转换成了1,然后第三次进入判断方法,判断1是大于0的,满足判断条件,并打印出1,再减去1,得到0,这是,目标值由1转换成了0,第四次进入判断方法,判断0是等于0的,不符合目标值大于0的判断条件,于是就进不去判断条件的内部,执行不了内部的其他程序,到这一步方法终止,停止运行。
运行示意图
把判断方法的每次调用,都看成是调用该方法的相同分身,而不是该方法的单一本身。
二、递归的使用(解决相关实际问题)
2.1、斐波那契数列
斐波那契数列是指形如{1,1,2,3,5,8,13,21…}这种类型的数列,它的首项为1,第2项也为1,且从第3项起,每一项都等于它前两项之和。
问题描述:通过输入一个正整数,然后返回它对应位置的斐波那契数列的值。例如,输入7,则返回13这个斐波那契数列的值。
代码演示
package demo3_1;
public class TestFebonacci {
public static void main(String[] args) {
//斐波拉起数列:1 1 2 3 5 8 13
System.out.println(febonacci(7)); // 7 : 是指位于第七项的斐波拉几数列
}
//打印第N项斐波拉圻数列
public static int febonacci(int i){
if(i == 1 || i == 2){ //第一项和第二项都是1,固定的
return 1;
}else {
return febonacci(i - 1) + febonacci(i - 2); //取出要打印目标数列的前两项,并相加,就是要打印的目标数列
}
}
}
运行结果
2.2、汉若塔
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
代码演示
package demo3_1;
/**
* 汉若塔问题
*/
public class TestHanoi {
public static void main(String[] args) {
// hanoi(2,'A','B','C');
hanoi(2,"开始柱子","中间柱子","目标柱子");
}
/**
*
* @param n : 有多少个盘子
* @param from : 开始柱子
* @param in : 中间柱子
* @param to : 目标柱子
* 无论有多少个盘子,都认为只有两个,上面的所有柱子和最下面的一个盘子
*/
public static void hanoi(int n, String from, String in, String to){ // char from, char in, char to
if(n == 1){
System.out.println("第1个盘子从" + " " + from + " " + "移动到" + " " + to);
}else if(n > 1){
//把最上面的所有盘子移动到中间的柱子
hanoi(n -1,from,to,in);
//把最下面的目标盘子移动到目标柱子
System.out.println("第" + n + "个盘子从" + " " + from+ " " + "移动到" +" " + to);
//再把开头移动到中间柱子的所有盘子再移动到目标柱子
hanoi(n-1,in,from,to);
}
}
}
运行结果
以上就是递归总结的所有内容。