【问题标题】:program To find the repetition of a number程序查找数字的重复
【发布时间】:2020-09-08 19:14:15
【问题描述】:

这是一个我无法解决的问题 该程序应该计算一个数字的重复次数,但是当我运行程序时,该函数似乎不会调用自己一次,直到数组按要求结束 有什么帮助吗? 这是代码,请看一下:)

    #include <stdio.h>
int count(int arr[],int counter,int size, int num,int i) {
    if (size != 0) {
        while (i<10) {
            if (arr[size - i] == num) {
                count(arr, size, counter++, num, i++);
            }

            else
            return counter;

        }

}

int main() {
    int result,n,i=1;
    int arr[] = {1,2,2,3,7,2,5,3,8,7};
    scanf("%d", &n);
    result=count(arr, 0,10,n,i);
    printf("%d", result);

    return 0;
}

【问题讨论】:

  • 当它递归调用自己时,它做错了两件事:(1)它没有返回任何东西(你的编译器应该给你一个警告),以及(2)它忽略了返回的值递归调用。
  • @TomKarzes 是的,你是对的,那么我应该怎么做才能解决这个问题?
  • 附带问题:反问:如果您将0 作为大小传递,您的函数会发生什么?
  • 为什么sizecounter 在您的通话中颠倒了?这是故意的吗?

标签: c++


【解决方案1】:

这可能对你有帮助:

#include <stdio.h>
int count(int arr[],int counter,int size, int num,int i) {
    if (size != 0) {
        for (;i<size;i++) {
            if (arr[i] == num) {
                counter++;
            }
        }
    }
    return counter;
}

int main() {
    int result,n,i=0,countt=0;
    int arr[] = {1,2,2,3,7,2,5,3,8,7};
    scanf("%d", &n);
    result=count(arr, countt,10,n,i);
    printf("%d", result);
    return 0;
}

【讨论】:

  • 是的,代码工作正常,但不幸的是我只需要递归:(。但是,Thnx 帮助兄弟 3>
【解决方案2】:

如果您使用递归遍历输入数组,则不应在递归函数中循环遍历同一数组。

代码中的几个问题:

if 条件导致 false 时,函数不会返回任何内容:

if (size != 0) {

编译器必须在这方面发出警告。

这里,你没有忽略count()的返回值:

                count(arr, size, counter++, num, i++);

您的递归函数count() 应该返回num 的频率。因此,您应该收到count() 返回的值,因为它在递归调用期间累积了num 的频率。

这可以使用递归轻松解决。你可以这样做:

#include <stdio.h>

int count (int *arr, int counter, int size, int num) {
    // terminating condition
    if (size <= 0) {
        return counter;
    }

    // check the current processing number
    if (*arr == num) {
        counter++;
    }

    // recursive call to process next number
    return count (arr + 1, counter, size - 1, num);
}

int main() {
    int arr[] = {1,2,2,3,7,2,5,3,8,7};
    int result, n;

    printf ("Enter a number:\n");
    scanf ("%d", &n);

    result = count(arr, 0, sizeof (arr)/sizeof (arr[0]), n);

    printf ("Frequency of %d is %d\n", n, result);

    return 0;
}

补充:

  • 不要硬编码数组的大小。您可以使用sizeof 运算符在编译时获取数组大小,如下所示:

    sizeof (arr)/sizeof (arr[0])
    
  • 让自己意识到尾递归,如果你不知道的话:
    如果在函数返回后除了返回其值之外无事可做,则称函数调用为尾递归。尾递归函数可以很容易地转换为迭代函数,因此编译器还可以通过消除递归来优化此类函数的代码,这意味着尾递归调用在恒定堆栈空间中运行,即它们不需要创建新堆栈递归调用自己时的帧。查看以下内容以获得更好的想法:
    How exactly does tail recursion work?

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 2013-08-22
    • 2021-01-28
    • 2022-01-03
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多