递归练习 求最大公约数 斐波那契数列 汉诺塔递归解法 小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶, 2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式。

/**
     * 运用递归,求最大公约数.(假设 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);
  }
}