我正在使用递归进行作业。我似乎无法弄清楚为什么我的函数在数组中没有数字时会返回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);
}
}
答案 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。