有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java递归问题这个解决方案正确吗?有更简单的解决方案吗?

我不熟悉递归,我发现了以下Java问题:
编写一个函数,获取整数n,并打印数字1!,2.3.n
以下是我所做的,我想知道这是否是最简单的解决方案(我不确定,因为我使用了“for”循环)

public static void Print(int n) {
  if (n == 0) {
    System.out.print("1");
  } else {
    int temp = 1;
    for (int i = 1; i <= n, i++) {
      temp = temp * i;
    }
    Print(n-1);
    System.out.print(temp);
  }
}

顺便说一句,上一个练习是编写一个函数,获取整数n并返回n!,使用递归。你认为我需要在这里使用它并打印它,而不是计算温度(n!)然后打印出来? 谢谢


共 (3) 个答案

  1. # 1 楼答案

    你写的东西是有效的,但是你正在重新计算一堆东西,你仍然在使用for循环,当你可以用更少的代码递归地完成整个事情时

    假设您无法使用函数Print(int n),那么您可以编写更少的代码,只需通过从1向上递归并携带计算来计算每个阶乘一次:

    public static void Print(int n) {
        PrintHelper(1, n, 1);
    }
    
    private static void PrintHelper(int i, int n, long factorial) {
        if (i > n)
            return;
    
        factorial *= i;
        System.out.println(factorial);
        PrintHelper(i + 1, n, factorial);
    }
    

    这更容易阅读,更容易推理,并避免重复同样的计算

    在我上面发布的示例中,我正在进行n乘法。在你的例子中,你在做大约n^2 / 2的乘法,因为你一次又一次地迭代每个数字(例如:1*2*3*..*50,然后1*2*3*..*49,然后1*2*3*..*48等等)

    为了简洁起见,我编写的代码省略了错误检查,因为您可以简单地向其中添加输入健全性检查

  2. # 2 楼答案

    使用递归获得一个数字的阶乘(上一个练习),这个方法看起来像

    long factorial(long n) {
        if (n > 0) {
            return n*factorial(n - 1);
        }
        return 1;
    }
    

    考虑到这一点,最好不要使用递归,而是使用循环来获得数字的阶乘,如下所示:

    long factorial(long n) {
        long factorial = 1;
        for (long i = 1; i <= n; i++) {
            factorial *= i;
        }
        return factorial;
    }
    

    如果你想要系列中的所有数字

    long[] factorials(long n) {
        long[] factorials = new long[n+1];
        long factorial = 1;
        for (long i = 1; i <= n; i++) {
            factorial *= i;
            factorials[n] = factorial;
        }
        factorials[0] = 1;
        return factorials;
    }
    

    如果只需要打印它们,则该方法将变为

    void factorials(long n) {
        long factorial = 1;
        System.out.println(factorial); // 0!
        for (long i = 1; i <= n; i++) {
            factorial *= i;
            System.out.println(factorial);
        }
    }
    
  3. # 3 楼答案

    下面是一个简单的递归解决方案:

      public static long factorial(long n) {
        if(n == 0 || n == 1) {
          System.out.print(1 + " ");
          return 1;
        }
    
        long result = n * factorial(n - 1);
        System.out.print(result + " ");
        return result;
      }