C++ 布尔递归函数总是返回true

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

我正在做一个使用递归的赋值。我似乎不明白为什么当数字不在数组中时,我的函数不会返回false。在我看来,由于某种原因,正在搜索的数字正在添加到数组中。如果有人能告诉我哪里出了问题,我将不胜感激

#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) {