Skip to content

Instantly share code, notes, and snippets.

@Qubik65536
Created April 16, 2024 22:17
Show Gist options
  • Save Qubik65536/e4ecca5a91909064869d0b16ffe4da83 to your computer and use it in GitHub Desktop.
Save Qubik65536/e4ecca5a91909064869d0b16ffe4da83 to your computer and use it in GitHub Desktop.

Revisions

  1. Qubik65536 created this gist Apr 16, 2024.
    119 changes: 119 additions & 0 deletions Main.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,119 @@
    import java.util.Scanner;

    public class Recursion {
    /**
    * 计算 n 的阶乘
    * @param n 非负整数
    * @return n 的阶乘
    */
    private static int factorial(int n) {
    if (n == 0) { // 如果 n 是 0,说明算到阶乘的最后一步了,直接返回 1(递归的终止条件)
    return 1;
    } else {
    return n * factorial(n - 1); // 否则,返回 n 乘以 n - 1 的阶乘,这样就可以递归地计算 n 的阶乘
    }
    }

    /**
    * 计算 n 的 m 次方
    * @param n 底数
    * @param m 指数
    * @return n 的 m 次方
    */
    private static double power(double n, double m) {
    if (m == 0) { // 如果 m 是 0,说明算到幂的最后一步了,直接返回 1(递归的终止条件)
    return 1;
    } else {
    if (m < 0) { // 如果 m 是负数,说明是求 n 的负 m 次方
    // 使用公式 n^(-m) = 1 / (n^m) 来计算 n 的负 m 次方
    return 1/(n * power(n, Math.abs(m) - 1)); // 这里使用了 Math.abs 方法来获取 m 的绝对值,来算 n 的 m 次方,然后再取倒数
    } else {
    return n * power(n, m - 1); // 否则,返回 n 乘以 n 的 m - 1 次方,这样就可以递归地计算 n 的 m 次方
    }
    }
    }

    /**
    * 计算 1 + 2 + 3 + ... + n 的和
    * @param n 非负整数
    * @return 1 + 2 + 3 + ... + n 的和
    */
    private static int sum(int n) {
    if (n == 0) { // 如果 n 是 0,说明算到和的最后一步了,直接返回 0(递归的终止条件)
    return 0;
    } else {
    return n + sum(n - 1); // 否则,返回 n 加上 1 + 2 + 3 + ... + (n - 1) 的和,这样就可以递归地计算 1 + 2 + 3 + ... + n 的和
    }
    }

    /**
    * 计算斐波那契数列的第 n 项
    * @param n 非负整数
    * @return 斐波那契数列的第 n 项
    */
    private static int fibonacci(int n) {
    if (n == 0 || n == 1) { // 如果 n 是 0 或 1,说明算到斐波那契数列的最后一步了,直接返回 n(递归的终止条件)
    return n;
    } else {
    return fibonacci(n - 1) + fibonacci(n - 2); // 否则,返回第 n - 1 项加上第 n - 2 项,这样就可以递归地计算斐波那契数列的第 n 项
    }
    }

    /**
    * 判断一个数是否是质数
    * @param n 要判断的数
    * @param f 从 2 开始的因子
    * @return 是否是质数
    */
    private static boolean isPrime(int n, int f) {
    if (n == f) { // 如果 n 等于 f,说明已经判断完了所有可能的因子,返回 true(递归的终止条件),这个数是质数
    return true;
    }
    if (n % f == 0) { // 如果 n 还没有等于 f 就已经可以被 f 整除,说明 n 不是质数,返回 false
    return false;
    }
    return isPrime(n, f + 1); // 否则还需要继续判断下一个因子
    }

    /**
    * 输出 n 到 100 之间的所有质数
    * @param n 起始数
    */
    private static void prime(int n) {
    if (n != 100) { // 如果 n 不等于 100,说明还没有到 100,继续判断
    if (isPrime(n, 2)) { // 如果 n 是质数
    System.out.print(n + " "); // 输出 n
    }
    prime(n + 1); // 继续判断下一个数
    }
    }

    /**
    * 将一个十进制数转换为二进制
    * @param num 十进制数
    * @param result 目前的结果
    * @return 二进制数
    */
    private static String toBase(int num, String result) {
    if (num == 0) { // 如果 num 是 0,说明已经转换完了,返回结果
    return result;
    } else { // 否则
    int remainder = num % 2; // 求余数,当前数除2的余数就是二进制数的当前位
    return toBase(num / 2, remainder + result); // 递归地将 num 除以 2,余数加到结果的前面,然后继续求下一位二进制数
    }
    }

    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    // System.out.print("Enter a number: ");
    // int n = scanner.nextInt();
    // System.out.println(sum(n));
    // System.out.println(fibonacci(n));
    // prime(3);
    System.out.print("Enter decimal to convert: ");
    int num = scanner.nextInt();
    System.out.print("Enter base to convert to: ");
    int base = scanner.nextInt();
    System.out.println(toBase(num, ""));
    }
    }