2012-04-19 54 views
1

下面引号是我的实际任务,下面是我当前的代码。有人能指引我走向正确的方向吗?请再次做家庭作业。递归乘以Evens?

编写一个称为multiplyEvens的递归方法,该方法返回前n个产品的连结,即使是整数。例如,multiplyEvens(1)返回2,multiplyEvens(4)返回384 (因为2 * 4 * 6 * 8 = 384)。如果传递了一个值抛出IllegalArgumentException小于1

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; 
    } 
+0

我在递归方面非常糟糕。我也会为做作业做这件事:p – 2012-04-19 00:49:27

+1

切碎机:让OP解决n-1的问题,然后从那里拿走它。 – 2012-04-19 01:44:31

回答

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

+2

邮寄没有直接回答(即代码)的人不应该为家庭作业-yoda语言 - – LeleDumbo 2012-04-19 06:45:58

+0

对不起,没有注意作业部分。我的眼睛被吸引到代码...我会下一次。好点子。 – mprivat 2012-04-19 13:54:51

5

尝试递归在N-1而不是N * N,看看你能弄清楚的multiplyEvens(n)价值如何与multiplyEvens(n-1)。也许这会让你从正确的方向开始。

3

任何可以递归完成的事情都可以迭代完成。可以这样想:当你写一个for循环时,在你确定你正在工作的任何值的奇偶(偶/奇)值之前,你需要有一个额外的值,直到n。

因为这是家庭作业,这里的广阔行程:

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

你大部分都在那里。

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 ... 

现在,你应该开始得到至少一个问题的线索,你的方法...

1

你应该向后做。即在每次递归调用时,返回(2 * n)*递归调用,减少n。基本情况是当n = 1时,函数只是返回2而不将它与另一个递归调用相乘(以满足您需要为n < 1抛出的IllegalArgumentException)。

0

乘以n等于
2^n * n!
所有你需要做的就是谷歌 阶乘递归的Java

+0

不,乘以1到10的所有偶数值都不会使我接近10!它接近3,840。 – Makoto 2012-04-19 01:21:38

+0

真:你有错误的等式。将前10个平均值乘以2到20,甚至在1到10之间都不是值。rickz是正确的。 – 2012-04-19 01:30:19

+0

@Jason,谢谢。 – rickz 2012-04-19 01:31:51