加入收藏 | 设为首页 | 会员中心 | 我要投稿 大庆站长网 (https://www.0459zz.com/)- 科技、智能边缘云、事件网格、云计算、站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-11-14 08:32:16 所属栏目:Java 来源:互联网
导读:如下非常简单的 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)

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

(编辑:大庆站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读