简单C++;递归不能正常工作-我只是不知道';我不明白为什么 我有一个小的C++程序,它只需总结整数数组的内容。调试输出显示递归函数被正确调用。我甚至还检查了数组的地址——整个数组都是一样的
我不明白为什么代码最后会显示出这个奇数。我显然做错了什么,但我不明白。有人有指向正确方向的指针吗简单C++;递归不能正常工作-我只是不知道';我不明白为什么 我有一个小的C++程序,它只需总结整数数组的内容。调试输出显示递归函数被正确调用。我甚至还检查了数组的地址——整个数组都是一样的,c++,recursion,C++,Recursion,我不明白为什么代码最后会显示出这个奇数。我显然做错了什么,但我不明白。有人有指向正确方向的指针吗 #include <iostream> using namespace std; int arr_sum(int arr[], int idx) { // debug cout << "arr[" << idx << "] = " << arr[idx] << " (" << arr <<
#include <iostream>
using namespace std;
int arr_sum(int arr[], int idx) {
// debug
cout << "arr[" << idx << "] = " << arr[idx] << " (" << arr << ")" << endl;
if (idx > 0) {
return arr[idx] + arr_sum(arr, idx - 1);
}
}
int main () {
int a[10];
a[0]=1; a[1]=2;a[2]=3;a[3]=4; a[4]=5;
a[5]=6; a[6]=7;a[7]=8;a[8]=9; a[9]=0;
cout << a << endl; // debug
cout << "Sum: " << arr_sum(a, 9) << endl;
}
您忘记了基本情况:如果
idx
为零,arr\u sum
返回什么
现在,函数不返回任何内容,这是非法的。打开编译器警告,每个编译器都会对此发出警告。当它执行时,它最终在堆栈上留下一个随机值,该值被解释为返回值,并添加到其他结果中。您忘记了基本情况:如果
idx
为零,arr\u sum
返回什么
if (idx > 0) {
return arr[idx] + arr_sum(arr, idx - 1);
}
现在,函数不返回任何内容,这是非法的。打开编译器警告,每个编译器都会对此发出警告。当它执行时,它在堆栈上留下一个随机值,该值被解释为返回值,并添加到其他结果中
if (idx > 0) {
return arr[idx] + arr_sum(arr, idx - 1);
}
你忘了那个案子
if (idx > 0) {
return arr[idx] + arr_sum(arr, idx - 1);
} else return arr[0];
你忘了那个案子
if (idx > 0) {
return arr[idx] + arr_sum(arr, idx - 1);
} else return arr[0];
用调试器一步一步地调试代码,问题会很明显。一个
否则
会起到很大的作用。arr\u sum(arr,0)
返回什么?问题标题应该实际说明具体的问题行为,否则对其他人来说是无用的。“递归不起作用”不太可能是问题所在。使用调试器逐步完成该代码,问题将是显而易见的。一个else
会产生很大的不同。什么是arr_sum(arr,0)
返回?问题标题实际上应该说明具体的问题行为,否则对其他人来说是无用的。“递归不起作用”不太可能是问题所在。我担心它太简单了。是的,非常感谢。编译器警告已打开,顺便说一句(GCC 4.6.3),它似乎没有针对此问题发出警告。我担心它太简单了。是的,非常感谢。编译器警告已打开,顺便说一句(GCC 4.6.3),似乎没有针对此问题发出警告。嗯。。应该是否则返回arr[0]代码>这将从总和中删除arr[0]
值。我认为进一步递归的条件应该是idx>=0
。(当然,在这种情况下,OP必须删除“调试”输出,以免访问arr[-1]),或者实际上,正如@IInspectable所说,在终止分支中返回arr[0]
。@TerraPass:Nope,idx>=0
将不起作用,因为对arr\u sum的递归调用将与idx-1
标记为是,假设您实际上没有访问arr[-1]
(也就是说,假设您删除了调试输出)。无论如何,否则返回arr[0]
是一个更干净的解决方案。嗯。。应该是否则返回arr[0]代码>这将从总和中删除arr[0]
值。我认为进一步递归的条件应该是idx>=0
。(当然,在这种情况下,OP必须删除“调试”输出,以免访问arr[-1]),或者实际上,正如@IInspectable所说,在终止分支中返回arr[0]
。@TerraPass:Nope,idx>=0
将不起作用,因为对arr\u sum的递归调用将与idx-1
标记为是,假设您实际上没有访问arr[-1]
(也就是说,假设您删除了调试输出)。无论如何,否则返回arr[0]
是一个更干净的解决方案。