递归函数在数组中找到第一个错误

recursive function that finds the first error in the array

本文关键字:第一个 错误 数组 递归函数      更新时间:2023-10-16

我正在尝试解决一个问题,该问题要求返回数组中的第一个元素的下标,该数组中某些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);
        }
    }
}