我正在测试一个递归函数,该函数返回数组中给定数字的出现次数。运行代码时出现意外结果。
#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;
}
答案 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>
。
您的代码的另一个问题是您正在使用cout
和cin
而不指定其名称空间。因此,与其直接使用cout
和cin
,还不如直接使用std::cout
和std::cin
或在包含之后声明use namespace std
。
编辑:正如托马斯·马修斯(Thomas Matthews)所指出的,相对于std::cout
,更喜欢使用std::cin
和using namespace std
。