有谁知道函数在返回某些内容后是否应该结束? 我的递归函数写在下面,但是每当它到达 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”后结束,但由于某种原因它没有结束。我已经完整地描述了这个问题,所以请阅读它。
据我所知,您正在尝试实现著名的“科拉茨猜想”。下面是一个工作版本...
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;
}
让我们内联一会儿,然后我们将讨论您的问题,它看起来过于冗长且难以消化(当我回来时我会解释这一点)。请注意我添加到您的代码摘录中的注释...
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
语句不会导致函数返回。
它工作正常,直到第一次返回“步骤”。
换句话说,“它工作得很好,直到它不起作用”,这是一个完全多余的陈述,我们可以将其附加到该网络上的几乎所有问题上。但这并没有增加意义,不是吗?希望你以后的问题能更容易理解,少一些无意义的废话。
有谁知道为什么会这样吗????
是的。
有谁知道函数在返回某些内容后是否应该结束?
...并且要明确的是,问“如果”某事与问“为什么”某事是不同的问题。这个不同问题的答案也是是。