C递归程序中的输出不准确

时间:2017-07-01 19:18:45

标签: c arrays function recursion

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.

任何形式的帮助都将受到高度赞赏。

3 个答案:

答案 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)

  1. 在将数组值传递给函数之前,请不要重置它们。
  2. count中的while循环毫无意义,重新思考它的工作方式,也许打印出递归调用。同样数也可能不会返回任何东西,修复它。
  3. 正如评论中已经提到的,在访问数组元素之前检查是否超出范围。