【发布时间】: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