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

时间:2015-09-19 03:09:16

标签: c arrays recursion

尝试使用递归搜索数组元素时遇到了一些困难。预期的输出应该是这样的:

d

我的代码的递归部分:

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

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

我在想是因为每次递归发生时,如果数组元素与target相同,我将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); } 变量的值设置为0并递增1,这就是值不加起来的原因而只是让我回到1?

有什么想法吗?提前谢谢。

被修改

found

2 个答案:

答案 0 :(得分:0)

最后一行应该是

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

上面的内容是未定义的行为,因为你在没有返回的情况下从非空函数的末尾掉了下来。

此外,在array[n] == a的情况下,您应该返回1 + rCountArray(array, n + 1, a);。仅仅因为你找到了一场比赛,并不意味着你应该停止搜索,你想找到所有的比赛!

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

你究竟是怎么称呼这个功能的?

另外作为最后一点建议,如果是我,我不会使用递归,我只会使用for循环,因为它更简单,更快。

答案 1 :(得分:0)

原始代码存在一些问题:

  • 第一个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));
}