查找数组中给定数字的出现次数

时间:2018-08-30 15:41:09

标签: c++

我正在测试一个递归函数,该函数返回数组中给定数字的出现次数。运行代码时出现意外结果。

#include <iostream.h>

int Occurence(int A[], int size, int n)
{
    static int occur=0;
    if(size == 0)
    {
        int occur2 = (int) occur;
        return occur2;
    }

    else
    {
        if ( n == A[size-1])
            occur++;
        Occurence(A, size-1, n);
    }
}
int main()
{
    int A[] = {1,3,2,5,1,2, 3, 7,7, 8,8, 4, 6, 9,9, 0};
    int size = sizeof(A)/sizeof(A[0]);

    int n;
    cout<< "Enter Number to Find : ";
    cin >>n;

    cout<<endl;
    cout<<"Number of Occurence of "<< n << " is :"<< Occurence(A, size, n)<<endl;

    return 0;   
}

2 个答案:

答案 0 :(得分:1)

您在函数末尾缺少回报。如果size不为0,则函数的行为未定义。添加退货应该可以使其正常工作:

int Occurence(int A[], int size, int n)
{
    static int occur=0;
    if(size == 0)
    {
        int occur2 = (int) occur;
        return occur2;
    }

    else
    {
        if ( n == A[size-1])
            occur++;
        return Occurence(A, size-1, n);
    }
}

递归是实现此问题的一种非常奇怪的方法,因此我认为这是一些玩具示例,用于演示递归的工作原理。即使是这种情况,您实际上也不应该在实现中使用静态变量。只需让每个调用返回当前总和即可:

int Occurence(int A[], int size, int n)
{
    if(size == 0)
    {
        return 0;
    }
    else
    {
        return (n == A[size-1] ? 1 : 0) + Occurence(A, size-1, n);
    }
}

此版本多次调用时将返回正确的结果,而您的原始版本每次都会添加到先前的计数中。

在真实代码中只需执行以下操作:

#include <algorithm>

int Occurence(int A[], int size, int n)
{
    return std::count(A, A+size, n);
}

答案 1 :(得分:0)

您的代码中存在一些编译问题。首先,在C ++中,标准库文件通常在文件名中没有扩展名。因此,包含<iostream.h>是错误的。您应该包括<iostream>

您的代码的另一个问题是您正在使用coutcin而不指定其名称空间。因此,与其直接使用coutcin,还不如直接使用std::coutstd::cin或在包含之后声明use namespace std

编辑:正如托马斯·马修斯(Thomas Matthews)所指出的,相对于std::cout,更喜欢使用std::cinusing namespace std