2017-07-01 28 views
-3

Ç递归函数错误不准确的输出

我学习“实用C语言编程,第三版” 由史蒂夫·林,它包含这种分配使得它具有以下要求的程序。

练习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

提示:不要使用全局或静态变量。 – melpomene

+0

@melpomene请详细说明? – Muneeb

+1

为什么在您接受用户的数据后,您将数组中的所有值重新赋值为“0”? – GoodDeeds

回答

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?这没什么错,但这是一个糟糕的设计,因为当你有成千上万行代码和很多功能时,这是一个问题。然后跟踪哪个变量导致任何问题或调试它将是非常乏味的。

你的问题

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()不返回任何值,所以没有使用其存储在一个变量。

我刚才提到了几个问题和干净的解决方案。有关详细说明,请参阅melpomene的答案。

+0

@melpomene .:对不起没有注意..我写。感谢您指点。 – coderredoc

+0

@coderredoc为什么在这里使用static错误,如果在不使用静态的情况下递归地调用函数,变量如何在下一阶段保存它们的值? – Muneeb

+0

@melpomene .:请检查先生。 – coderredoc

0
  1. 不要在将数组值传递给函数之前重置数组值。
  2. count中的while循环没有意义,重新考虑它的工作方式,可能会打印出递归调用。也可能不会返回任何东西,修复它。
  3. 正如在评论中已经提到的那样,在访问数组元素之前检查是否超出界限。在你的代码
+0

谢谢你的帮助。 :) – Muneeb

2

问题:

  • 您的代码重置用它做任何事情之前输入数组0

  • count在检查if(i == size)之前访问array[i],即您有超出边界的访问权限。

  • 您递归调用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的数组,但是您将它传递给一个采用int的数组的函数。
  • 您错过了#include <stdlib.h>对于system()
+1

为什么我需要包括stdlib时,我可以访问系统()没有它? – Muneeb

+0

@Muneeb包括''将提供'system'的声明,它允许编译器在你用不正确的参数调用它时发出警告。如果没有范围声明,'system(“...”)'会起作用(因为'system'恰好返回'int'),但编译器也会接受'system(1,2,3)'参数数量,错误类型)。这种事通常会导致运行时崩溃(或垃圾结果)。 – melpomene

+1

哦,上帝为什么我要在编码的时候照顾很多东西。我想问你一件事,如果我可以吗? – Muneeb