3.1 递归

1.什么是递归

在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。

从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’

2.递归方法的优点

使程序代码更加简洁、清晰,提高代码的可读性。

3.递归方法的缺点

使程序的运行速度变慢,压栈、出栈等操作增加了算法的时间复杂度和空间复杂度,递归层次过深,还易导致栈溢出等问题

4.例题

4.1汉诺塔问题

​ 汉诺塔是一个发源于印度的益智游戏,也叫河内塔。相传它源于印度神话中的大梵天创造的三个金刚柱,一根柱子上叠着上下从小到大64个黄金圆盘。大梵天命令婆罗门将这些圆盘按从小到大的顺序移动到另一根柱子上,其中大圆盘不能放在小圆盘上面。当这64个圆盘移动完的时候,世界就将毁灭。

推荐视频:直达

推荐播客:直达

ps:视频的形式比较容易理解!

public class HanoiTest {

	int n = 0;

	public static void main(String[] args) {
		hanoi(2, 'a', 'b', 'c');
	}

	/**
	 * 将n个盘从A移动到C
	 * 
	 * @param n
	 * @param A
	 * @param B
	 * @param C
	 */
	private static void hanoi(int n, char A, char B, char C) {
		if (n == 1) {
			System.out.println("move:" + A + "-->" + C);
		} else {
			hanoi(n - 1, A, C, B);//n-1 层从a 到b
			System.out.println("move:" + A + "-->" + C); // 执行最大盘子移动
			hanoi(n - 1, B, A, C);//n-1 层从b 到c
		}
	}

}

4.2 斐波那契数列问题

斐波那契数列是:0,1,1,2,3,5,8,13,21,34,55,89,144……。你会发现,这个数列中元素的性质是,某个数等于它前面两个数的和;也就是 a[n+2] = a[n+1] + a[n]。至于起始两个元素,则分别为 0 和 1。在这个数列中的数字,就被称为斐波那契数

现在的问题是,写一个函数,输入 x,输出斐波那契数列中第 x 位的元素。例如,输入 4,输出 2;输入 9,输出 21。要求:需要用递归的方式来实现

编码实现:

public class FibonacciTest {

	private static int fibonacci(int n) {
		if (n <= 0) {
			return -1;
		}
		if (n == 1) {
			return 0;
		}
		if (n == 2) {
			return 1;
		} else {
			return fibonacci(n - 1) + fibonacci(n - 2);
		}
	}

	public static void main(String[] args) {
		int n = 13;
		System.out.println("第" + n + "个数是:" + fibonacci(n));
	}

}
posted @ 2020-10-27 15:05  Nixon  阅读(116)  评论(0编辑  收藏  举报