如何知道解决方案是否正确?

时间:2018-02-18 14:58:25

标签: recursion

问题是: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));
}
}

1 个答案:

答案 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仍然会好得多。