Java和C中的不同结果在递归中使用=

如下非常简单的 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));
    }
}

输出为1,应为8.相对C/C++代码如下:

#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;
}

添加测试java代码

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);
}

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...