如下非常简单的
Java代码具有奇怪的输出,但C和C中的相同逻辑代码具有正确的输出.我尝试使用JDK 1.7和JDK 1.3(相对JRE),奇怪的输出始终存在.
public class Test { public static int sum=0; public static int fun(int n) { if (n == 1) return 1; else sum += fun(n - 1); // this statement leads to weird output // { // the following block has right output // int tmp = fun(n - 1); // sum += tmp; // } return sum; } public static void main(String[] arg) { System.out.print(fun(5)); } }
#include<stdio.h> int sum=0; int fun(int n) { if (n == 1) return 1; else sum += fun(n - 1); return sum; } int main() { printf("%d",fun(5)); return 0; }
class A { public int sum = 0; public int fun(int n) { if(n == 1) { return 1; } else { sum += fun(n - 1); return sum; } } } public class Test { public static void main(String arg[]){ A a = new A(); System.out.print(a.fun(5)); } }
解决方法
为了给出一个完整的答案,我将通过这个来获得乐趣(3).对于那些不感兴趣的人,为什么这适用于C但不适用于Java,请忽略我的答案.
以下是Java正在做的事情:
内心的乐趣(3)
sum += sum + fn(n-1) // sum is 0
变
sum = 0 + fun(2) // sum is 0
内心乐趣(2)
sum = 0 + fun(1) // sum is 0
内心乐趣(1)
return 1 // sum is 0
回到里面的乐趣(2)
sum = 0 + 1; // sum is 0
变
sum = 1; // sum will soon become 1
回到里面好玩(3)
sum = 0 + 1; // sum is 1
变
sum = 1; // sum gets reset to 1
这是C正在做的事情:
内心的乐趣(3)
sum += fn(n-1) // sum is 0
变
sum = sum + fn(2) // sum is 0
内心乐趣(2)
sum = sum + fn(1) // sum is 0
内心乐趣(1)
return 1 // sum is 0
回到里面的乐趣(2)
sum = sum + 1 // sum is 0
变
sum = 0 + 1 => sum = 1 // sum will soon become 1
回到里面好玩(3)
sum = sum + 1 // sum is 1
变
sum = 1 + 1 // sum will soon become 2
你应该做什么:
我不知道为什么C在进行函数调用之后而不是之前评估sum.我不知道这是否符合规格.但我确实知道你不应该用任何语言来依赖它.一个正确的解决方案是:
int fun(int n) { if (n == 1) return 1; else return n + f(n - 1); }