【问题标题】:C function repeats if statement after return statementC函数在return语句之后重复if语句
【发布时间】:2022-11-17 06:47:14
【问题描述】:

有谁知道一个函数在返回某些东西后是否应该结束? 我的递归函数写在下面,但是每当它到达 else 语句并在它返回一个值(步骤)之后,

它运行“if (new_number % 2 == 1)”语句,

这是没有意义的,因为函数应该在到达 else 语句时结束并且不应该重复。

它工作正常,直到它第一次返回“步骤”。

这是第一次返回后发生的情况: 它甚至没有完全运行“if (new_number % 2 == 1)”语句,它只是跳转到该行并将“steps”和“input_steps”的值减 1。“new_number”和“number”只是获得完全随机的值

然后它返回“steps”,然后跳转到“if (new_number % 2 == 1)”语句并将“steps”和“input_steps”的值减1。“new_number”和“number”只是得到完全随机的值再次。

它重复该循环,直到“new_steps”和“steps”等于 0,然后它返回 0(因为“steps”= 0)并结束函数。

有谁知道为什么会这样????

这是我的代码:

`


int step_recursion(int number, int input_steps)
{
    int new_number = number;
    int steps = input_steps;

    if (new_number != 1)
    {
        if (new_number % 2 == 0)
        {
            if (new_number != 1)
            {
                step_recursion(new_number / 2, steps + 1);
            }
        }
        if ((new_number % 2) == 1)
        {
            if (new_number != 1)
            {
                step_recursion(new_number * 3 + 1, steps + 1);
            }
        }
    }

    return steps;
}

`

我期待函数在返回“步骤”后结束,但由于某种原因它没有。我已经完整地描述了这个问题,所以去读吧。

【问题讨论】:

  • 1)您发布的内容中没有其他声明。 2)这是一个递归函数,所以可以同时有多个实例在玩。 3)函数的任何实例在返回某些东西后都会结束。它返回给它的调用者&调用者继续执行。 4) 调用者可以是并且经常是尚未返回的例程的前一个实例。
  • 这个函数丢弃从递归调用返回的返回值是奇怪的,而且可能是错误的。假设递归终止,具有相同功能的此代码的更高效版本将是 int step_recursion(int number, int input_steps) { return steps; } 我怀疑这是否真的是预期的。
  • 为什么它会多次检查new_number != 1?我想 if ((new_number % 2) == 1) 应该是 else
  • 递归函数可能很难理解。它有助于向函数添加 depth 参数。然后打印函数参数(包括depth)作为函数的第一行。并在函数返回之前打印一条消息(包括depth)。例如,第一个 printf 可以是 printf("begin %d -- N=%d S=%d\n", depth, number, input__steps);,另一个可以是 printf("end %d -- S=%d\n", depth, steps)。递归调用看起来像step_recursion(depth+1, new_n...)

标签: c function if-statement return repeat


【解决方案1】:

让我们在线讨论一下,然后我们将介绍您的问题,这似乎过于冗长且难以消化(我会在回过头来解释)。请注意我添加到您的代码摘录中的 cmets...

if (new_number % 2 == 0)
{
    if (new_number != 1)
    {
        // if your intent is to control flow such that execution doesn't continue beyond here, you'd surely want a `return` statement here...
        /* return ... */
        step_recursion(new_number / 2, steps + 1);
    }
}
if ((new_number % 2) == 1)
{
    if (new_number != 1)
    {
        /* ditto here */
        step_recursion(new_number * 3 + 1, steps + 1);
    }
}

我已经完整地描述了这个问题,所以去读吧。

我对你的问题的看法是,它相当冗长,充满了错误的前提(这些问题被伪装成错误的事实陈述)和不必要的(英语)样板,应该作为不同的问题提出。例如:

您正在阅读哪本书教您“函数在到达 else 语句时应该结束”?这是对 C 的根本误解。需要明确的是,else 语句不会导致函数返回.

它工作正常,直到它第一次返回“步骤”。

换句话说,“它工作正常直到它不起作用”,这是一个完全多余的声明,我们可以附加到该网络上的几乎任何问题。但是,这并没有增加意义,不是吗?希望你以后的问题更容易理解,少一些毫无意义的废话。

有谁知道为什么会这样????

缺少完整的问题描述并不是关闭的唯一原因; sometimes we close questions because they have multiple built-in questions...

有谁知道一个函数在返回某些东西后是否应该结束?

......要清楚,问如果与询问不同的问题为什么某物。

TLDR;对此持保留态度,但当你来到这里时,你真的需要考虑一下你要什么信息如何询问确切的信息无需同时询问其他问题(或注入无效断言)。

【讨论】:

    【解决方案2】:

    据我所知,您正在尝试实施著名的“Collat​​z 猜想”。下面是一个工作版本...

    int step_recursion(int number, int steps = 1) {
       if (number == 1) {
          return steps;
       }
    
       if (number % 2 == 0) {
          return step_recursion(number / 2, steps + 1);
       } else {
          return step_recursion(number * 3 + 1, steps + 1);
       }
    
       return steps;
    }
    
    • 在您的代码中,如果数字不等于 1,您将检查两次。如果您有“提前返回”则更好
    • 您不返回递归调用的值,您只是调用函数

    【讨论】:

    • int steps = 1 是无效的 C。与某些其他语言不同,不能为参数提供默认值。