C 函数在 return 语句后重复 if 语句

问题描述 投票:0回答:2

有谁知道函数在返回某些内容后是否应该结束? 我的递归函数写在下面,但是每当它到达 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;
}

我原以为函数会在返回“steps”后结束,但由于某种原因它没有结束。我已经完整地描述了这个问题,所以请阅读它。

c function if-statement return repeat
2个回答
4
投票

据我所知,您正在尝试实现著名的“科拉茨猜想”。下面是一个工作版本...

int step_recursion(int number, int steps) {
   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,你会检查两次。如果你有“提前返回”,那就更好了
  • 您不返回递归调用的值,您只是调用函数

0
投票

让我们内联一会儿,然后我们将讨论您的问题,它看起来过于冗长且难以消化(当我回来时我会解释这一点)。请注意我添加到您的代码摘录中的注释...

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); */
        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
语句不会导致函数返回

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

换句话说,“它工作得很好,直到它不起作用”,这是一个完全多余的陈述,我们可以将其附加到该网络上的几乎所有问题上。但这并没有增加意义,不是吗?希望你以后的问题能更容易理解,少一些无意义的废话。

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

是的

有谁知道函数在返回某些内容后是否应该结束?

...并且要明确的是,问“如果”某事与问“为什么”某事是不同的问题。这个不同问题的答案也是

© www.soinside.com 2019 - 2024. All rights reserved.