如下所示的非常简单的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。这将递归重复,直到行数满足条件。 我想得到完全未来 我的代码在不需要进行间隔拆分时运行正常。如果需要递归调用,它将只返回空列表,递归调用将在稍后异步执行。 我也尝试过使用类似的东西,但没用: 如果我知道自己做错了什么,我会心存感激。谢谢