【问题标题】:why is this recursive function doesn't return 'counter' value?为什么这个递归函数不返回“计数器”值?
【发布时间】:2022-12-06 17:56:41
【问题描述】:
int rec(int k)
{
    static int temp = 0, counter = 0;
    if(!k) return counter;
    if(k%2 == 0){
        counter++;
        temp = rec(k/2);
    }
    if(k%2){
        counter++;
        temp = rec(k-1);
    }
}

这个函数应该得到一个数字 k 并检查需要多少操作才能通过乘以 2 或加 1 将 k 归零。 此函数工作正常,但返回零而不是计数器中的最后一个值。我试图调试它,我看到计数器值增加,但在达到它应该返回的值后,函数向后返回以完成所有调用,并返回 0。 我通过使 counter 全局化并且不返回任何内容来修复它,但我的问题是:

有没有办法像函数内部的计数器一样修复它?

为什么这个函数最后返回零?

【问题讨论】:

  • 如果if(!k)是会发生什么不是真的?那么你的函数返回什么?请向您的rubber duck 解释。
  • 另一方面,if (k % 2 == 0) { ... } if (k % 2 != 0) { ... }(这就是您的基本条件)可以写成if (k % 2 == 0) { ... } else { ... }
  • temp的目的是什么。你分配给它但你从未读过它。
  • @Someprogrammerdude,感谢您的回答,如果if(!k) 不正确,它会按预期进行。只有当 k 为 0 时,这个 if 才会返回。
  • 与其浪费你自己和其他人的时间去寻找编译器已经发现的错误,你可以开始倾听编译器必须说的话:What compiler options are recommended for beginners learning C?“警告:变量'temp'已设置但未使用”,“警告: 控制到达非空函数的末尾”。为什么要感谢 gcc 先生,您在不到 1 秒的时间内发现了两个错误!

标签: c recursion


【解决方案1】:

这是一个很好的递归函数,它根本不声明任何变量,它是纯粹的递归!

int get_steps_to_zero(int n)
{
    if (n == 0) {
        // Base case: we have reached zero
        return 0;
    } else if (n % 2 == 0) {
        // Recursive case 1: we can divide by 2
        return 1 + get_steps_to_zero(n / 2);
    } else {
        // Recursive case 2: we can subtract by 1
        return 1 + get_steps_to_zero(n - 1);
    }
}
get_steps_to_zero(457);
> 13

【讨论】:

    【解决方案2】:

    这应该工作

    int rec(int k)
    {
        static int temp = 0, counter = 0;
    
        if (k == 0)
            return 0;
    
        if (k % 2 == 0)
        {
            counter++;
            rec(k / 2);
        }
        else
        {
            counter++;
            rec(k - 1);
        }
        return counter;
    }
    

    函数调用

    int main()
    {
        printf("%d", rec(10));
        return 0;
    }
    

    输出

    5
    

    【讨论】:

    • k!=0 时,该函数不返回任何内容。当k==0时,你只是(不)幸运地阅读了最新的返回值。 godbolt.org/z/sazzdez56 打印 -387500904
    • 为什么它不适用于温度?
    • 另外,这个问题是用C语言标记的,而你的代码是C++。在 C++ 函数中离开 return 语句会导致未定义的行为.
    • @Someprogrammerdude 我的程序是用c写的,我标记了c。我什至不知道c++。
    • 我讨厌在这里问问题,但我不知道其他地方。我从来没有得到很好的直截了当的答案,而且我总是得到与我的问题无关的奇怪的 cmets。
    猜你喜欢
    • 2018-09-03
    • 1970-01-01
    • 2018-10-19
    • 2020-11-18
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多