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

dawei

【声明】:淮南站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。