1

我正在自己完成一本 o'reilly 教科书中的问题集,我对我应该用这个程序做什么有点困惑。问题是:编写一个函数count(number, array, length)来计算数字出现的次数array。数组有length元素。该函数应该是递归的。编写一个测试程序以使用该功能。

这个问题是逐字复制的,但我对这个问题有几个问题。如果您可以发表评论说明您对以下内容的看法,那就太好了:

  1. 好的,我需要一个arraywith length length,我是否将自己的号码存储在插槽中?还是我生成随机整数进入插槽?
  2. 另外,我有正确的计划吗?我的计划是:

创建数组并调用countmain。该函数count将是一个 if 循环,它遍历数组,直到找到number它然后将一个添加到计数器。然后count函数将使用参数调用它自己count(int number; int array; int (length - 1))

现在我试图通过它来说服自己,我现在更加困惑。也许我只是让这个问题变得更加困难。任何提示都会有所帮助。谢谢

4

2 回答 2

2

我认为一个代码片段比很多单词更有价值。所以我会去做这样的事情:

#include <iostream>

int count(int num, int* arr, int length) {
    if (!length)
        return 0;
    int c = count(num, arr+1, length-1);
    return arr[0] == num? c + 1: c;
}

int main(void) {
    int arr[10] = {1, 2, 3, 4, 3, 2, 1, 4, 3, 2};

    std::cout << count(2, arr, 10);

    return 0;
}

输出:

3
于 2013-05-29T23:25:46.960 回答
0
  1. 要测试您的函数是否正确,您可以在数组中使用自己的数字。算法有效很重要。
  2. 不,你的方法是错误的。递归有两个部分:

a) 关于你知道什么的条款

b) 如果你改变你所拥有的,你可以知道什么的条款。

因此,在您的情况下,该函数count(.....)首先应该知道 是否length为 0,因为该数字number是 0 中的 0 次array。如果不是,您需要调用您的函数count(.....)作为number数字(因为您仍然想计算相同的数字)array除了数组的最后一个元素和length-1. 这会递归地向下移动数组,直到其中没有更多项目。

~短暂的休息,让大脑焕然一新~

您应该将函数的返回值保存在一个变量中,如果最后一项array是,则添加 1 number,否则不是。并再次返回该值。现在这个值通过所有函数调用向后传递,如果我们正在查看的数组元素是number. 原始调用count(....)返回numbers的数量array

我希望我的解释没有失败。

于 2013-05-29T23:32:31.493 回答