【问题标题】:Recursive method sum of powers of 2 up to Xth power of 2递归方法 2 的幂和直到 2 的 X 次幂
【发布时间】:2014-03-01 08:58:49
【问题描述】:

我的递归方法有问题,它将返回并在 main() 中打印 2 的幂的总和,直到 2 的 X 次幂。X 是命令行参数上的整数。

所以如果我的命令行参数是:“3”

*输出为:15

它应该像 (1 + 2 + 4 + 2^3) 一样工作,如您所见,2 有“3”次幂

所以无论我的数字是多少,都会加上 2 的幂。我设法获得了 2^x 的幂,但我真的很困惑将 2 的幂的总和添加到我的计算中:o

另外,我不会使用 Math.pow(),即使它会更容易 x)

我的密码ATM:

public static void main(String[] commandlineArguments) {
      if (commandlineArguments.length == 0) {
         System.out.println("Please enter a least one commandline!");
      } 
      else {
         Integer number = new Integer(0); // initialize number
         try {
            number = Integer.parseInt(commandlineArguments[0]);
         } 
         catch (NumberFormatException exception) { // NumberFormatException
            System.out.println(exception + " is not a integer!");
            System.exit(1); // end program
         }

         Integer power = power2(number);
         System.out.println(power);

      }
   }

   public static Integer power2(Integer number){
      if (number == 0) {
         return 1;
      } 
      else {
         return 2 * power2(number - 1);
      }
   }

}

【问题讨论】:

  • 提示:您正在计算总和,但没有使用单个 +。所以你需要在某处添加一个。

标签: java recursion methods command-line return


【解决方案1】:

哦,看在上帝的份上。

return ( 1 << ( number + 1 ) ) - 1;

对于那些喜欢任意精度的人来说,

return BigInteger.ONE.shiftLeft( number + 1 ).subtract( BigInteger.ONE ); 

我认为一个封闭的形式有资格作为普通递归。

【讨论】:

  • 对不起:c!您的代码对这些输出进行了正确采样。虽然我正在使用递归方法并且它应该调用自己?
【解决方案2】:

试试,

public static Integer power2(Integer number){
       return (number==0)?1:2*power2(number - 1);
}
public static Integer method1(Integer number){
    return (number==0)?1:power2(number)+method1(number-1);
}

然后拨打method1

输出:

method1(3)  ==>  15

【讨论】:

    【解决方案3】:

    首先坚持使用int,而不是整数作为原语更快并且引入更少的开销。

    其次,如果您只需要 2 的幂,我建议您使用左移运算符 &lt;&lt;,因为它可以满足您的需求:

    public static int powerOf2Sum(int number) {
      if( number == 0 ) {
         return 1;
      }
      return (1 << number) + powerOf2Sum( number - 1 );
    }
    

    注意:请注意整数溢出,因为当幂大于 32(int 中的位数)时,它将翻转。在这种情况下,您需要一个 long,它能够表示高达 64 次幂的整数。

    【讨论】:

    • 嗨 aljipa,我想我解释错了我的问题,因为你的代码输出不正确+4+8+16) + 2^5。 :o
    • 应该是1 &lt;&lt; number
    • 虽然,有没有不使用左移运算符的其他方法?
    • 我的不好,回答的时候有点困,当然应该是1
    【解决方案4】:

    尝试返回这个:

    int result = power5(number - 1);
    return 2 * result + result;
    

    这样,如果你输入 1,你会得到 2^1 + 2^0 等等..

    【讨论】:

      【解决方案5】:

      试试这个

      public static Integer power5(Integer number){
            if (number == 0) {
               return 1;
            } 
            else {
               return 2 * power5(number - 1)+ power5(number - 1);
            }
         }
      

      【讨论】:

      • 我在我的问题中添加了一个示例输出,因为我可能会造成混淆:o
      【解决方案6】:

      我喜欢你的问题,并且许多其他答案对于输入 30 或更少的内容都很好;但我想要更好的东西

      private static final BigInteger TWO = BigInteger.ONE
          .add(BigInteger.ONE);
      
      private static BigInteger power2(int n) {
        BigInteger l = BigInteger.ONE;
        for (int i = 0; i < n; i++) {
          l = l.multiply(TWO);
        }
        if (n > 0) {
          return l.add(power2(n - 1));
        }
        return BigInteger.ONE;
      }
      public static void main(String[] commandlineArguments) {
        int number = 3;
        BigInteger result = power2(number);
        System.out.printf("power2(%d) = %s\n", number, result);
        while (true) {
          BigInteger MAX = new BigInteger(
              String.valueOf(Integer.MAX_VALUE));
          result = power2(number);
          if (result.compareTo(MAX) > 0) {
            System.out.printf("power2(%d) = %s\n", number, result);
            break;
          }
          number++;
        }
        number = 256;
        result = power2(number);
        System.out.printf("power2(%d) = %s\n", number, result);
      }
      

      输出

      power2(3) = 15
      power2(31) = 4294967295
      power2(256) = 231584178474632390847141970017375815706539969331281128078915168015826259279871
      

      【讨论】:

        【解决方案7】:
        public static void main(String[] commandlineArguments) {
          if (commandlineArguments.length == 0) {
             System.out.println("Please enter a least one commandline!");
          } 
          else {
             Integer number = new Integer(0); // initialize number
             try {
                number = Integer.parseInt(commandlineArguments[0]);
             } 
             catch (NumberFormatException exception) { // NumberFormatException
                System.out.println(exception + " is not a integer!");
                System.exit(1); // end program
             }
        
             Integer power = power5(number);
             System.out.println(power);
        
          }
        }
        
        public static Integer power5(Integer number){
              Integer sum = 0;
        if(number == 0)
        {
            return 1;
        }
        Integer pow = 1;
        for(int i = 0; i < a; i++)
        {
            pow *= 2;
        }
        sum = pow + power5(a--);
        return sum;
        }
        
        }
        

        【讨论】:

        • 嗨 Simba,作为递归,我正在尝试循环而不使用迭代/for 循环:o
        猜你喜欢
        • 1970-01-01
        • 2014-08-21
        • 1970-01-01
        • 1970-01-01
        • 2014-02-21
        • 2014-11-05
        • 1970-01-01
        • 2017-12-03
        • 1970-01-01
        相关资源
        最近更新 更多