问题是:f(0)= 3; f(1)= 5; f(n)= 3 * f(n-1)-f(n-2)+17;我认为我的代码没问题,但我没有任何证据证明我的结果是正确的。问题是f(3)和f(20)是什么。对于f(3)我得到'99'而对于f(20)我得到'1469588013'。我担心的是从f(1)= 5到f(3)= 99的跳跃看起来有点奇怪......
一般来说,我怎么知道我正在编写一个正确的代码...不是在语法方面,而是在结果中返回?
我必须使用递归,java必须是语言:)
这是我的代码
public class rekursion {
public static int reku(int n) {
if (n == 0) return 3;
else if (n == 1) return 5;
else return 3*(reku(n-1)) - reku(n-2) + 17;
}
public static void main(String[] args) {
System.out.println(reku(20));
}
}
答案 0 :(得分:0)
你的算法,翻译成scala,给我69为3:
scala> def reku2 (n: Long) : Long ={
| if (n == 0L) 3 else
| if (n == 1L) 5 else
| 3*(reku2 (n-1)) - reku2 (n-2) + 17L
| }
reku2: (n: Long)Long
scala> (1 to 20).foreach (x => println (reku (3, 5, x)))
5
21
11
69
-19
243
-283
1029
-1861
4965
-10531
25443
-57019
133365
-304405
704517
-1617715
3731283
-8584411
19778277
我们可以改变它,而不是向下跑:
scala> def reku (lo: Long, hi: Long, target: Long) : Long = target match {
| case 0 => 3L
| case 1 => hi
| case x => reku (hi, 3*lo - hi + 17, target - 1)
| }
reku: (lo: Long, hi: Long, target: Long)Long
(1 to 10).foreach (x => println (reku (3, 5, x)))
这将为每个较低的值调用该函数一次,而不是2,4,...次。
请注意,使用Long会比Int更有趣。 BigInteger仍然会好得多。