C语言中带返回值的递归函数类型

4

这是一个简短的问题,我进行了搜索,但找不到回答我的问题的内容。

在C语言中进行递归函数时,即使使用void函数,您是否需要有一个返回值?

例如:

    void addToLL(structA_ptr new, structA_ptr cur) {
        if (cur->next == NULL) {
             cur->next = new;
        } else {
             addToLL(new, cur->next);
        }
    }

在调用函数之前,我需要加上return关键字吗? 我知道如果函数会返回一些东西,比如在LL中搜索某些内容,它就需要一个return语句。


3
你尝试过它之后发生了什么? - Greg Bacon
4
当他尝试时,似乎它起作用了,但他并不100%确定自己完全理解了发生了什么,因此他非常正确地认为应该向StackOverflow的专家询问。 - RichieHindle
1
如果你在考虑是否应该在函数内部加入"return addToLL(new, cur->next);",那么不应该这样做:这会导致错误,因为你的"addToLL"函数没有返回值,所以在函数体内返回"addToLL"是不允许的。 - Alok Singhal
8个回答

9

不需要。

长话短说: 你的递归函数像任何其他函数一样被执行,如果没有遇到递归调用,它将被简单地终止。你不需要显式返回。你可以使用它来提前退出函数。


4
在这种情况下,不需要使用return语句,但这是因为函数在递归调用后没有执行任何操作。
如果您有以下代码:
void addToLL(structA_ptr new, structA_ptr cur) {
    if (cur->next == NULL) {
         cur->next = new;
    } else {
         addToLL(new, cur->next);
    }

    someOtherCode();
}

如果您不希望在addToLL()调用后继续执行someOtherCode(),则需要在该调用之后插入return;语句。


函数在递归调用后没有做任何事情?也许在下降的过程中不会,但是在上升的过程中呢? - Tony van der Peet

0

我相信你的示例代码是一个很好的递归函数示例,可以轻松转换为循环,从而在操作非常长的链表时减少对堆栈的压力。

void addToLL(structA_ptr new, structA_ptr cur) {
    while (cur->next)
        cur = cur->next;
    cur->next = new;
}

0
从函数中返回值并不是递归的前提条件 - 在任何语言中都是如此。所以,不需要。

0

这更多是一个风格问题。有些人认为在没有return关键字的情况下结束void函数是一种失误,而其他人则不在意。虽然这与递归无关。


0

当您的函数结束时,它会隐式返回,因此无需调用返回指令。

[增值] 当在程序中添加返回函数时,函数的本地变量和参数将被删除,并且返回值将可用于调用函数,并在调用位置恢复执行。
当返回“void”函数时,它们只需清理参数和本地变量,而不需要担心将返回值移动到正确的位置。


0

没有必要使用返回类型。

即使没有返回类型,递归函数仍然很有用,因为它可以打印值、通过指针参数计算事物或执行各种其他操作。


0
在返回类型为void的函数中,使用显式的return语句的唯一原因是如果您想要提前退出函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接