【问题标题】:Using recursion to compute factorials without new variables [duplicate]使用递归计算没有新变量的阶乘
【发布时间】:2016-08-31 13:02:29
【问题描述】:

我正在尝试使用递归计算方法 factorialRecursive 中输入的阶乘,但是我无法在该方法中声明任何变量或对象,这就是我正在努力解决的问题,我的尝试已经在该方法中但不起作用.这必须在 While 循环而不是 for 循环中调用自身。

class Factorial{
  public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    int number;
    do {
      System.out.print("Enter a positive number: ");
      number = input.nextInt();
    } while (number < 0);
    System.out.println(number + "! = " + factorialIterative(number) + " (iterative)");
    System.out.println(number + "! = " + factorialRecursive(number) + " (recursive)");
  }

  private static int factorialIterative(int num) {
    int result = 1;
    while (num > 0) {
        result = num*result;
        num--;
    }
    return result;
  }

  private static int factorialRecursive(int num){
     if (num==1 | num==0)
         return 1;
     return num*(num-1) * num;
  }
}

【问题讨论】:

  • Java 中的阶乘递归已在此站点上处理过多次。搜索这三个关键字会带来足够的点击率,其中一个是我的关闭投票。

标签: java recursion return


【解决方案1】:

递归意味着你需要在方法内部调用方法本身

示例:

private static int factorialRecursive(int num){
     if (num==1 | num==0)
         return 1;
     return num*factorialRecursive(num-1);
  }

并且由于阶乘会随着低值增加非常高,请考虑使用除整数之外的其他数据类型...否则它只会在阶乘(16)之前有效,之后您将通过使用整数获得无效数据...

private static long factorialRecursive(long num){
         if (num==1 | num==0)
             return 1;
         return num*factorialRecursive(num-1);
      }

【讨论】:

    【解决方案2】:

    试试这个:

    private static int factorialRecursive(int num) {
        // Warning here use || instead of |
        if (num==1 || num==0)
            return 1;
        return num * factorialRecursive(num - 1);
    }
    

    我也可以这样简化:

    private static int factorialRecursive(int num) {
        return (num == 1 || num == 0) ? 1 : num * factorialRecursive(num - 1);
    }
    

    【讨论】:

      【解决方案3】:

      您不需要声明任何变量。利用阶乘的递归关系:

      n! = n * (n - 1)!

      num 乘以通过传递num - 1 进行递归调用的结果。返回该产品而不将其存储在变量中。

      【讨论】:

        猜你喜欢
        • 2015-04-19
        • 2017-04-19
        • 2013-02-19
        • 1970-01-01
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        • 2013-09-18
        • 2013-03-30
        相关资源
        最近更新 更多