当前位置: 首页 > 面试题库 >

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

袁旻
2023-03-14
问题内容

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


 类似资料:
  • 一、想要实现的效果 二、我的代码 public class People { } public static void main(String[] args) { 三、代码执行结果 四、解释 我递归用的少,用起来有点不达意。上面自己写的递归方法虽然能实现递归效果,但问题很大。 4.1、我的方法返回的只是命中项,而不是一个树的结构(除非第一层就命中了)。 4.2、返回的树里没有剔除未命中项。 上述两

  • 问题内容: 我在C#和Java中发现了一些奇怪的地方。让我们看一下这个C ++代码: 在控制台中,您将看到X = 11(在此处查看结果-IdeOne C ++)。 现在让我们看一下C#上的相同代码: 在控制台中,您将看到1(而不是11!)(在这里查看结果-IdeOne C# 我知道您现在在想什么-“这怎么可能?”,但让我们转到下面的代码。 Java代码: 结果与C#中的结果相同(X = 1,在此处

  • 问题内容: 我正在使用《 Java:完整参考》这本书来学习Java。目前,我正在从事递归主题。 请注意: 关于stackoverflow也有类似的问题。我搜索了它们,但没有找到解决问题的方法。我对以下程序中的逻辑感到困惑。 如果我运行下面的程序,它将产生正确的输出,但是我不理解其逻辑。 我不理解以下行中的逻辑: result = fact(n-1)* n; 据我所知,如果我们按以下程序所示传递n

  • 我想知道为什么我用这两对递归的明显例子得到了意想不到的表现。 相同的递归函数在结构中更快(rec2 VS rec1),相同的递归模板函数在虚拟参数中更快(rec4 VS rec3)! 使用更多参数的C++函数是否更快?! 下面是尝试的代码: 我得到这样的输出: 我已启用:Windows 8.1/i7 3630QM/Latch Qt ChainTool/C++14

  • 我现在正在实现模拟N体问题的Barnes-Hut算法。我只想问关于建筑树的部分。 我做了两个函数来为它构建树。 我递归地构建树,并在构建时打印每个节点的数据,一切看起来都是正确的,但当程序返回到主函数时,只有树的根和根的子节点存储值。其他节点的值没有被存储,这很奇怪,因为我在递归过程中打印了它们,它们应该被存储。 这是经过修改的代码的一部分,我认为问题可能在哪里: 下面是函数set_root_an

  • 我有以下代码,即从返回CompletableFuture的web API获取给定时间间隔的报告。如果超过了返回报告的行数,时间间隔将被分成两半,并为两半调用API。这将递归重复,直到行数满足条件。 我想得到完全未来 我的代码在不需要进行间隔拆分时运行正常。如果需要递归调用,它将只返回空列表,递归调用将在稍后异步执行。 我也尝试过使用类似的东西,但没用: 如果我知道自己做错了什么,我会心存感激。谢谢