递归函数在数组中找到第一个错误
recursive function that finds the first error in the array
我正在尝试解决一个问题,该问题要求返回数组中的第一个元素的下标,该数组中某些propedicate函数返回false。如果没有这样的元素,请返回-1。
请注意,我需要使用某种宣传来评估正确性阵列中的每个元素的元素,我的第一张法函数中无法有任何循环。
我的功能看起来像这样
int firstFalse(const string a[], int n)
其中一个[]是字符串数组,n是数组中的元素数
这是某种宣传函数
bool somePredicate(string s)
{
int nDigits = 0;
for (int k = 0; k != s.size(); k++)
{
if (isdigit(s[k]))
nDigits++;
}
return nDigits == 5;
}
我只是在学习递归的工作原理,这是一场噩梦,我花了3个小时在这个特殊的问题上,没有运气。请有人解释我在这里需要如何之前的逻辑。我了解递归在某种程度上是如何工作的,但我无法从逻辑上弄清楚如何解决此问题。
您的问题意味着您必须使用递归。好的,现在尝试将其分解为逻辑步骤。
1)您将为" N"
大小的数组确定这一点2)如果数组为空,也就是说,如果n = 0,则答案很明显。您没有找到这样的元素,所以您返回-1
3)如果数组不是空的,请递归地调用您的功能,以大小n-1
。
4)您的递归呼叫是否返回答案?假设递归调用返回了大小n-1
数组的正确答案,如果它返回-1以外的其他内容,则您又返回了大小n
的数组的相同答案。
5)否则,如果递归调用返回-1,则必须意味着对于大小n-1
的数组,谓词函数返回了所有元素(或数组为空)。在这种情况下,答案很明显:调用元素数组[N -1]的谓词函数(n
大小的数组中的最后一个元素,您现在正在检查)。如果返回false,则大小 n
数组中的最后一个元素是谓词函数返回false的第一个元素,因此您因此返回 n-1
,否则返回值为-1,因为谓词函数尚未返回true。
现在,将上述内容转换为代码,您将得到答案。
好的,在花了3个小时来解决这个愚蠢的问题之后,我想我终于解决了它,但是需要数小时的反复试验。请有人解释一下我如何解决这些类型的问题以更容易找到解决方案。
这是我的解决方案,如果有人可以提供更好的解决方案,请告诉我。
int firstFalse(const string a[], int n)
{
if(n<0)
{
return -1;
}
else
{
if(somePredicate(a[n])==false)
{
if(firstFalse(a,n-1)== -1)
return n;
}
else
{
return firstFalse(a,n-1);
}
}
}
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 分段错误 .AnsiStringToUnicodeString 作为第一个调试错误行.杜比奥斯类等级制度
- 增量生成 - 错误:字符串的第一个字符应'0'或'1'
- 如果语句错误地读取字符串,则始终在第一个条件返回
- 为什么这段代码给出错误......'a'是指针到字符指针,应该存储's'的地址,因为s是指向数组的第一个元素的指针
- 在将第一个值插入链表时尝试访问 head 时出现分段错误
- C OPENCV中的错误是我的第一个代码(中值过滤器)
- 尝试分叉一个过程,第一个命令有效,但第二总是给出错误
- 为什么我在这个例子中有分段错误(核心转储),但在第一个例子中没有
- 文本文件中的第一个字符会导致 .substr() 错误
- 获取列表的第一个和最后一个元素<string>给我非法指令错误
- 从链表的第一个节点中删除时出现段错误
- C++比较运算符重载中第一个参数为 null 时出现分段错误
- 递归函数在数组中找到第一个错误
- OOP C++第一个编译器错误
- 访问第一个元素时出现C++矢量分割错误
- C++:队列中的第一个字符错误
- 为什么我在第一个代码中出现分段错误,而在第二个代码中却没有
- 素数程序停在20,031的第一个素数,225,149,没有明显的原因。无错误消息
- 错误:未定义文件中的第一个引用符号