布尔递归函数始终返回true

时间:2018-02-22 22:00:00

标签: 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 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);
    }
}

3 个答案:

答案 0 :(得分:3)

很多人都指出你有一个内存访问问题,你试图访问超出数组大小的内存。已经在函数的顶级调用中,您会导致问题,因为您将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的{​​{1}}的值与0进行比较,而不是测试您的索引变量现在为0,这是我建议的代码所做的。

但这也可能解释了为什么函数总是返回true,尽管未定义的行为和程序没有崩溃。由于您的函数未正确终止,因此会不断调用S。因此,它将继续减少索引并改变访问的isMember(...,S-1,...)的内存位置。此过程将持续进行,直到找到arr[S]或找到您要查找的值。它恰好偶然发生在你​​遇到0之前在某个地方遇到目标值。

答案 1 :(得分:1)

您将索引号发送到isMember,从零开始,当您向成员发送5时,成员arr [5]未定义。 并应该使用像

这样的方法
S < 0

您的代码没有结束条件我在您的代码中添加结束条件以在if (S < 0) return false; 之后结束递归

#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 - 1, numSearched)) {
        cout << "True" << endl;
    }
    else {
        cout << "False" << endl;
    }

    return 0;
}

bool isMember(int arr[], const int S, int search) {
    if (S < 0)
        return false;
    bool found = false;

    //cout << "index is " << S << "\t" <<  arr[S] << endl;

    if (arr[S] == search) {

        found = true;
        return found;
    }

    return isMember(arr, S - 1, search); 
}

试试这个;)

STRICT

答案 2 :(得分:0)

错误处于递归函数的停止条件:

else if ((arr[S] == 0) && (arr[0] != search)) {

    return found;
}

您没有将索引检查为第一个,但内容为零。你可以尝试这样的事情:

else if (S <= 0) {

    return false;
}

您也不需要检查值以匹配&#34;搜索&#34;,因为它之前的条件是多余的。您也可以直接返回false。