为什么我们在递归函数中使用 return?[复制]

Why did we use return here in Recursive Function? [duplicate]

提问人:Me at Work 提问时间:10/8/2023 最后编辑:Vlad from MoscowMe at Work 更新时间:10/8/2023 访问量:94

问:

为什么我们在双倍链表讲座的这段代码中使用 return ?当我运行代码时,递归是在不写返回kw的情况下发生的,那为什么我们需要它呢?

Node* reverseusingRecursion(Node* &prev,Node* &curr){
  //*base condition
  if (curr==NULL)
  {
    //*LL has been reversed
    return prev;
  }
   //* 1 case solve rest will be taken care by recursion function(This is the basic escence of a recursive function)
   Node* forward=curr->next;
        curr->next=prev;
        prev=curr;
        curr=forward;

        return reverseusingRecursion(prev,curr);

}

我已经编写了代码,而没有在 * return reverseusingRecursion(prev,curr);* 中使用 return,它工作正常。 那为什么我们需要输入return呢?

在此处输入图像描述

C++ 递归 返回 函数调用

评论

2赞 ggorlen 10/8/2023
请参阅为什么我不应该上传代码/数据/错误的图片?。如果不返回节点,调用方将如何检索列表的新头,该头曾经是旧列表中的尾部?您必须将其传回调用堆栈。调用方如何使用此代码?顺便说一句,这种算法不太适合递归,因为你可以很容易地破坏调用堆栈,而且比循环更容易编写。DSA不适用于数据结构和算法。
4赞 Yksisarvinen 10/8/2023
它工作正常只有不幸。你承诺总是返回一个 ,所以删除它意味着你的代码有未定义的行为,你的程序可以做任何事情,包括让恶魔从你的鼻子里飞出来reverseusingRecursionNode*return
0赞 BoP 10/8/2023
函数通过将值放在特殊位置来返回值。在递归函数中返回多个级别时,内部级别可能已将值放在预期位置,而外部级别可能会偶然绊倒它。要使其“真实”工作,您必须在每个级别返回值。
0赞 tbxfreeware 10/8/2023
旁注:从C++11开始,在C++中没有位置。请改用。NULLnullptr
0赞 Peter 10/8/2023
该函数具有非返回类型,因此必须通过语句返回(而不是“从末尾掉下来”)以避免未定义的行为。未定义行为的一个令人讨厌的特征(理论上是假设的,但实际上在实践中发生了)是,正如您所经历的那样,它似乎在测试中起作用 - 直到一些不相关的变化(编译器更新、操作系统更新、程序被非开发人员的最终用户使用)并且突然程序停止按预期工作。voidreturn

答:

-1赞 Vlad from Moscow 10/8/2023 #1

该函数必须返回指向反向列表的新头节点的指针。指向新头节点的指针是在函数的最后一次递归调用中获取的。因此,函数的所有先前递归调用都必须返回在函数的最后一次递归调用中获取和返回的指针。如果没有 return 语句,则返回的指针是未定义的。

如果由于生成的目标代码,函数将指针放在编译器用来从函数返回值的寄存器中,则该函数可能会意外地按预期工作。但这并不能保证。prev

您始终必须编写有效的 C 代码,并且不要依赖编译器生成的目标代码。