概述
这里记录一下常用递归算法解决的一些问题。掌握好递归算法就是要注意两个问题,第一个是先写递归出口即终止条件,然后才是自身函数的调用。当然在这中间或者末尾可以有其它的一些处理逻辑,比如打印之类的函数。
阶乘
所谓阶乘,就是n! = n*(n-1)*...*2*1
,示范代码如下。
// java
public static int factorial(int n) {
if (n == 1)
return 1;
return n * factorial(n-1);
}
斐波那契数列
第一项和第二项都是 1 ,然后从第三项开始依次是前两项的和,其递归代码如下。
// java
public static int fibonacci(int n) {
if (n == 1 || n == 2)
return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
汉诺塔
汉诺塔的故事来源有很多,大家感兴趣可以百度一下。简单说来就是有 3 根柱子A,B,C
,A 柱子上由上至下依次由小至大排列的圆盘。我们需要把 A 柱子上的圆盘借 B 柱子全部移动到 C 柱子上,并且移动的过程始终是小的圆盘在上,大的在下,一次只能移动一个圆盘。
// java
// n 表示起始 A 上的圆盘个数,A B C 表示三个柱子
// 这样传参表明将 A 柱子上的 n 个圆盘借助 B 移动到 C 上
public static void hanoi(int n, char A, char B, char C) {
// n == 1 直接 A --> C
if (n == 1) {
System.out.println(A + " --> " + C);
return;
}
// 将 A 柱子上的 n-1 圆盘借助 C 移动到 B 上
hanoi(n-1, A, C, B);
// 移动 A 上剩下的一个圆盘到 C 上
System.out.println(A + " --> " + C);
// 将 B 柱子上的 n-1 圆盘借助 A 移动到 C 上
hanoi(n-1, B, A, C);
}
总结
不忘初心,砥砺前行!