1

引号下面是我的实际任务,下面是我当前的代码。有人可以指出我正确的方向。

编写一个名为 multiplyEvens 的递归方法,它返回前 n 个偶数的乘积。例如, multiplyEvens(1) 返回 2, multiplyEvens(4) 返回 384(因为 2 * 4 * 6 * 8 = 384)。如果传递的值小于 1,则抛出 IllegalArgumentException。

  private static int multiplyEvens(int n)
  {  
      if(n%2 == 0)
      {           
          System.out.println(n*n);
          return multiplyEvens(n*n);
                      // I'm lost
      }
      System.out.println();
      return n; 
  }
4

6 回答 6

5

尝试在 n-1 上而不是在 n*n 上递归,看看你是否能弄清楚 的值multiplyEvens(n)multiplyEvens(n-1). 也许这会给你一个正确的方向。

于 2012-04-19T00:42:25.687 回答
5

在纸上走一遍。

从 n = 1 开始

1%2 = 1 so you don't do into your loop, and return value = 1 (wrong)

尝试 n = 2

2%2 = 0, so you go into your loop and call multiplyEvens(2*2)
4%2 = 0, so you go into your loop and call multiplyEvens(4*4)
16%2 = 0 ...

到目前为止,您应该开始了解您的方法中至少存在一个问题......

于 2012-04-19T00:43:50.410 回答
3

任何可以递归完成的事情都可以迭代完成。可以这样想:当您编写一个 for 循环时,在确定您正在处理的任何值的奇偶校验(偶数/奇数)值之前,您需要拥有一个额外的值,最多为 n。

由于这是家庭作业,这里是粗略的描边:

  • 您的递归条件可能需要两个参数而不是一个。
  • 您应该将值相乘直到某个值i <=n

你大部分时间都在。

于 2012-04-19T00:42:50.570 回答
1

你应该倒着做。即在每个递归调用中,返回 (2 * n) * 减少 n 的递归调用。基本情况是当 n = 1 时,该函数仅返回 2 而不将其与另一个递归调用相乘(以实现您需要在 n < 1 时抛出的 IllegalArgumentException)。

于 2012-04-19T00:44:27.020 回答
0

乘以 n 个偶数等于
2^n * n!
你所要做的就是谷歌阶乘递归java

于 2012-04-19T01:20:19.253 回答
0

干得好:

public static void main(String[] args) {
    System.out.println(multiplyEvens(4));
}

private static int multiplyEvens(int n) {
    if(n < 1) throw new IllegalArgumentException("Value less than 1 not supported");
    else if(n == 1) return 2;
    else return multiplyEvens(n-1) * (n*2);
}

这里是递归算法的基础知识。您必须假设您已经为 n-1 计算了结果。然后返回为 n 调整的 n-1 的结果。(也就是说,你乘以第 n 个偶数,n*2)。递归方法调用完成其余的工作,它反过来假设它已经计算了 n-2 的值,等等......直到 n==0,结果为 1

于 2012-04-19T02:02:24.970 回答