C++ 布尔递归函数总是返回true
我正在做一个使用递归的赋值。我似乎不明白为什么当数字不在数组中时,我的函数不会返回false。在我看来,由于某种原因,正在搜索的数字正在添加到数组中。如果有人能告诉我哪里出了问题,我将不胜感激C++ 布尔递归函数总是返回true,c++,recursion,boolean,C++,Recursion,Boolean,我正在做一个使用递归的赋值。我似乎不明白为什么当数字不在数组中时,我的函数不会返回false。在我看来,由于某种原因,正在搜索的数字正在添加到数组中。如果有人能告诉我哪里出了问题,我将不胜感激 #include "stdafx.h" #include <iostream> using namespace std; bool isMember(int[], const int, int); int main() { const int SIZE = 5; int
#include "stdafx.h"
#include <iostream>
using namespace std;
bool isMember(int[], const int, int);
int main() {
const int SIZE = 5;
int myArr[SIZE];
int numSearched;
cout << "Enter 5 numbers to be searched through." << endl;
for (int i = 0; i < SIZE; i++) {
cout << "Enter number " << i + 1 << endl;
cin >> myArr[i];
}
cout << "What number do you want to find?" << endl;
cin >> numSearched;
if (isMember(myArr, SIZE, numSearched)) {
cout << "True" << endl;
}
else {
cout << "False" << endl;
}
return 0;
}
bool isMember(int arr[], const int S, int search) {
bool found = false;
cout << arr[S] << endl;
if (arr[S] == search) {
found = true;
return found;
}
else if ((arr[S] == 0) && (arr[0] != search)) {
return found;
}
else {
return isMember(arr, S - 1, search);
}
}
#包括“stdafx.h”
#包括
使用名称空间std;
布尔伊斯曼(int[],const int,int);
int main(){
常数int SIZE=5;
int myArr[大小];
int numsearch;
cout您向isMember发送的索引编号从零开始,当您向is成员发送5时,arr[5]未定义。
并且应该像这样使用这种方法
isMember(myArr, SIZE - 1, numSearched)
并且您的代码没有结束条件我将结束条件添加到您的代码中,以在S<0
if (S < 0)
return false;
if(S<0)
返回false;
试试这个;)
#包括
使用名称空间std;
布尔伊斯曼(int[],const int,int);
int main(){
常数int SIZE=5;
int myArr[大小];
int numsearch;
cout错误在递归函数的停止条件下:
else if ((arr[S] == 0) && (arr[0] != search)) {
return found;
}
您没有将索引检查为第一个索引,而是将内容检查为零。您可以尝试以下操作:
else if (S <= 0) {
return false;
}
否则,如果(S许多人指出,当您试图访问数组大小以外的内存时,会出现内存访问问题。在函数的顶级调用中,您已经导致了问题,因为您将size
作为数组索引参数。如果size
是数组的大小,则arr[size-1]
是内存中数组的最后一个元素。arr[SIZE]
是超出末尾的一个元素。访问超出数组内存占用空间的内存会导致未定义的行为,这是不好的
总的来说,错误的索引在这里是一个巨大的问题。但是即使您修复了上面的问题,另一个问题行也在这里,因为您试图在S
达到0时停止,但是您写的不正确
else if ((arr[S] == 0) && (arr[0] != search)) {
您希望这是:
else if (S == 0) {
语句arr[0]!=search
是多余的,因为上面的条件已经检查过了。原始语句arr[S]==0
尝试将arr
在S
的值与0进行比较,而不是测试索引变量现在是否为0,我建议的代码就是这样做的
但这也可能解释了为什么函数总是返回true,尽管存在未定义的行为,并且程序没有崩溃。因为函数没有正确终止,它将继续调用isMember(…,S-1…)
。因此,它将不断减少索引并更改arr[S]的哪个内存位置
被访问。此过程将一直进行,直到找到arr[S]==0
或找到您要查找的值。在运行到0之前,您碰巧在内存中的某个位置遇到了目标值。else if((arr[S]==0).
这应该是else if((S==0)吗…
??到目前为止,您正在查看的是数组的值,而不是索引。听起来您可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,您可以逐行执行程序,并查看它与预期的偏差。如果您要进行任何编程,这是一个必不可少的工具。F其他读数:S
为大小,arr[S]
超出边界。arr[S]
访问越界数据,因为S
是数组的大小,最后一个索引是S-1
。found
变量的意义是什么?为什么不返回true;
和返回false;
。保持简单!我还建议一种更具防御性的方法,例如,不检查负索引。它将以之前的状态返回:谢谢,我知道我在看一些简单的东西。我倾向于过度思考这个问题。通常最令人头痛的事情其实很简单。复杂性在于找出它们的位置:)
else if (S == 0) {