C递归函数错误
我正在学习“实用C编程,第3版” 由Steve Oualline撰写,它包含了这项任务,以制作一个具有以下要求的程序。
练习9-3:编写一个计算的函数
count(number, array, length)
number
中显示的array
次数。该数组具有length
个元素。该 函数应该是递归的。编写测试程序以使用该功能。
我在15分钟内编写了程序,但我的输出并不是我想要的。这是代码:
#include <stdio.h>
int length;
int count(int num2count, int array[length], int size);
int main(void)
{
char check;
int i = 0;
long int num_to_be_counted;
int ans;
printf("Please enter the length of array:");
scanf("%d",&length);
long int numbers[length];
for(int i = 0; i != length; ++i) {
numbers[i] = 0;
}
printf("Enter the array:");
while( check != '\n') {
scanf("%li",&numbers[i]);
++i;
check = getchar();
}
printf("Enter the number to be counted in the array:");
scanf("%d",&num_to_be_counted);
for(int i = 0; i != length; ++i) {
numbers[i] = 0;
}
ans = count(num_to_be_counted,numbers,length);
printf("The number appears %d times in the array.",ans);
return 0;
}
int count(int num2count, int array[length], int size)
{
static int times = 0;
static int i = 0;
if ( array[i] == num2count) {
++times;
}
if(i == size) {
return times;
}
while( i != length ) {
++i;
count(num2count,array,length);
}
}
程序正常,没有错误(逻辑除外),这是示例输入和输出
length = 4
numbers = 1 2 2 4
number_to_count = 2
Output: 4
该功能甚至不计算要计算的数量;它只返回数组的大小,例如在这种情况下为4.
任何形式的帮助都将受到高度赞赏。
答案 0 :(得分:2)
代码中的问题:
您的代码在使用它之前将输入数组重置为0
。
count
在检查array[i]
之前访问if(i == size)
,即您的访问权限超出范围。
您对count
的递归调用包含在循环中。这没有任何意义,因为嵌套的count
调用将循环自身(并且在每次迭代中再次调用count
,这将循环自身,...)。
count
中的所有局部变量都是static
,这意味着该功能无用:您无法在任何程序中多次调用它。一个更好的测试程序来证明这一点就像:
for (int i = 0; i < length; i++) {
printf("%d appears %d times in the array\n", numbers[i], count(numbers[i], numbers, length));
}
其他问题:
int i;
函数中未使用main()
。check
未初始化。getchar()
的结果分配给char
通常是一个坏主意; getchar()
因某种原因返回int
。numbers
被声明为long int
的数组,但您将其传递给采用{{1}数组的函数}。int
遗失了#include <stdlib.h>
。答案 1 :(得分:0)
这里有很多问题。
首先,这比它应该复杂得多。您使用了static
,这根本不需要。
答案是错误的,因为您已多次计算。
这应该是这样的。您可以尝试理解此代码。
int count(int num2count, int array[], int size)
{
if( size<= 0) return 0;
return (array[size-1]==num2count)+count(num2count,array,size-1);
}
或
int count(int num2count, int array[], int size)
{
if( size<= 0) return 0;
return (array[0]==num2count)+count(num2count,array+1,size-1);
}
为什么我不应该在递归中使用static
?这没有错,但这是一个糟糕的设计,因为当你拥有数千行代码和许多功能时,这是一个问题。然后跟踪哪个变量导致任何问题或调试它将是非常乏味的。 1
int count(int num2count, int array[length], int size)
{
static int times = 0; // bad design and unnecessary.
static int i = 0;
if ( array[i] == num2count)
{
++times;
}
if(i == size)
{
return times;
}
while( i < length ) <----check
{
++i;
count(num2count,array,length);
}
}
count()
也不返回任何值,因此不能将其存储在变量中。1 我刚才提到了一些问题和问题的清洁解决方案。有关详细说明,请参阅 melpomene 的回答。
答案 2 :(得分:0)