递归练习
求最大公约数
/**
* 运用递归,求最大公约数.(假设 m > n)
*
* @param m
* @param n
* @return
*/
static int gcd(int m, int n) {
if (n == 0)
return m;
return gcd(n, m % n);
}
斐波那契数列
/**
*
斐波那契数列
*
O(2^n)
* @param n
n为最后一项的索引
* @return
*/
static int fib(int n) {
if (n == 1 || n == 2)
return 1;
return fib(n - 1) + fib(n - 2);
}
汉诺塔递归解法
/**
* 汉诺塔递归解法
*/
public class _01_TowerOfHanoi {
public static void main(String[] args) {
printHanoiTower(20, "A", "B", "C");
}
/**
* 将N个盘子从source移动到target的路径的打印
*
* @param N 初始的N个从小到达的盘子,N是最大编号
* @param from 原始柱子
* @param to 辅助的柱子
* @param help 目标柱子
*/
static void printHanoiTower(int N, String from, String to, String help) {
if (N == 1) {
System.out.println("move " + N + " from " + from + " to " + to);
return;
}
printHanoiTower(N - 1, from, help, to); // 先把前N-1个盘子挪到辅助空间上去
System.out.println("move " + N + " from " + from + " to " + to); // N可以顺利到达target
printHanoiTower(N - 1, help, to, from); // 让N-1从辅助空间回到源空间上去
}
}
小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶, 2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式。
import java.util.Scanner;
public class Case01_小白上楼梯 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
int n = sc.nextInt();
int res = f(n);
System.out.println(res);
}
}
private static int f(int n) {
if (n == 0) return 1;
if (n == 1) return 1;
if (n == 2) return 2;
return f(n - 1) + f(n - 2) + f(n - 3);
}
}