【问题标题】:Recursive Function java递归函数 java
【发布时间】:2015-07-13 00:31:17
【问题描述】:

问题 1

编写一个递归函数,返回 1 和 n 之间的偶数的乘积。

public static void main(String[] args) {
    for (int n=0; n<10; n++)
    { 
         System.out.println("f("+n+") = "+fact(n));
    }
}

public static int fact(int number)
{
    if(number==2)
        return 1;
    else
    {
         if(number%2==0)
             return number*fact(number-1);
         else
         {
             return fact(number-1);
         }
    }
}

不确定我在哪里做错了。请帮忙..谢谢。

【问题讨论】:

  • 如果您的代码有问题,请解释到底发生了什么。你得到一个编译器错误吗?还是一个例外?结果错了吗?
  • 这个问题不是在描述一个事实,而是一个不同的问题。您的代码看起来更像是分解。您只需 return number*fact(number-2); number==2 的起始值是 2 而不是 1。然后,您需要决定是否要接受奇数并调整循环。

标签: java recursion


【解决方案1】:

应该是:

if(number==2)
    return 2;

你还应该处理number==0number==1,比如:

    if(number==0)
        return 1; //or 0, it depends on what you want
    else if(number==2)
        return 2;
    else
    {
         if(number%2==0)
             return number*fact(number-1);
         else
         {
             return fact(number-1);
         }
    }

【讨论】:

  • 我将其更改为 2,但在 netbeans 中仍然有错误。
  • @user3807187 你也应该处理number==0number==1
【解决方案2】:

当 number=0 时,它调用 fact(-1) --> fact(number-1)

当 number=1 时,它调用 fact(0) 然后调用 fact(-1) ... fact(-x)

【讨论】:

    【解决方案3】:

    底是 2 的事实,它 = 2 而不是 1

    public static int fact(int number){

       if(number==2)
           return 2;
       else
           return (number%2==0) ? number*fact(number-1): fact(number-1);
    
          }
    

    【讨论】:

      【解决方案4】:

      如果你递归地思考,这很简单:)

      public static void main(String[] args) {
          int n = 10;//Or whatever you want your N to be
               System.out.println("f("+n+") = "+recursiveEvenProduct(2, n));
      }
      
      public static int recursiveEvenProduct(int low, int n)
      {
          if(low <= n-2)//Or (low <= n-3) if you don't want to include n
              return low *= recursiveEvenProduct(low+2, n);
          return low;
      }
      

      这只是其中一种方法。我相信你可以想出更多的办法。

      【讨论】:

        【解决方案5】:
        public static int productOfEvens(int n)
        {
            if (n > 1)
                if (n%2 == 0)
                    return n *= productOfEvens(n-1);
                else 
                    return productOfEvens(n-1);
            return 1;
        }
        

        这个方法首先被另一个方法调用,然后由它自己递归调用,n-1 次,每次递归调用 n 减 1,直到它减到 2。然后它递归返回到 N,有收集它传递的偶数的所有值,递归相乘。由于结果很快就会变得很大,因此您可以使用 long 而不是 int。

        【讨论】:

        • 虽然这个答案可能是正确且有用的,但最好在其中附上一些解释来解释它如何帮助解决问题。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。
        【解决方案6】:

        您可以直接拨打return number*fact(number-2);,因为您只需要偶数

        if(number==0) {
                return 1; //or 0, it depends on what you want
            } else if(number==2){
                return 2;
            } else {
                 if(number%2==0) {
                     return number*fact(number-2);
                 } else {
                     return fact(number-1);
                 }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-26
          • 1970-01-01
          • 2020-07-15
          • 2012-09-19
          • 2015-03-01
          • 2018-08-07
          相关资源
          最近更新 更多