繁体   English   中英

递归以查找数组中相同元素的数量

[英]Recursion to find the amount of same elements in an array

尝试使用递归对数组元素执行搜索时遇到一些困难。 预期的输出应如下所示:

Enter array size: 10
Enter 10 numbers: 1 2 3 4 5 5 6 7 8 9
Enter the target number: 5
rCountArray() = 2 

而我的代码的递归部分:

int rCountArray(int array[], int n, int a)
{
    int found = 0;
    if (n < 1) {
        return -1;
    }
    if(array[n] == a){
        ++found;
        return found;
    }
    rCountArray(array, n + 1, a);
}

现在的问题是,无论数组中有多少个重复的元素,它总是给我值1。

我在想是因为每次递归都发生时,如果数组元素与目标相同,我会将found变量的值设置为0并以1递增,这就是为什么该值不累加,而是用1返回给我只要?

有任何想法吗? 提前致谢。

编辑

int main()
{
    int array[SIZE];
    int index, count, target, size;

    printf("Enter array size: ");
    scanf("%d", &size);
    printf("Enter %d numbers: ", size);
    for (index = 0; index < size; index++)
        scanf("%d", &array[index]);
    printf("Enter the target: ");
    scanf("%d", &target);
    count = rCountArray(array, size, target);
    printf("rCountArray() = %d", count);
    return 0;
}

最后一行应该是

return rCountArray(array, n + 1, a);

上面的内容是未定义的行为,因为您将退出非void函数的结尾而没有返回。

另外,在array[n] == a的情况下,您应该返回1 + rCountArray(array, n + 1, a); 仅仅因为找到一个匹配,并不意味着您应该停止搜索,而是想要找到所有匹配!

最后,需要有一些停止条件。 例如,您也可以传递数组的大小,并在到达数组时停止。 或者, n可以从数组的大小开始,您可以递减而不是递增。

您究竟如何调用此函数?

作为最后的建议,如果是我,我不会为此使用递归,而是使用for循环,因为它更简单,更快捷。

您的原始代码有几个问题:

  • 第一个if应该测试< 0因为您希望它在数组索引变为0时执行下一个测试。
  • 它永远不会return -1 当函数失败时,它必须返回0
  • found增加后不返回。
  • 递归调用rCountArray()n + 1应该为n - 1以减少数组的索引。
  • 实际的返回指令应为: found + rCountArray()

int rCountArray(int array[], int n, int a)
{
    int found = 0;
    if (n < 0) 
        return 0;

    if (array[n] == a)
        ++found;

    return (found + rCountArray(array, n - 1, a));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM