为啥这个递归函数返回正确的值? [复制]

Posted

技术标签:

【中文标题】为啥这个递归函数返回正确的值? [复制]【英文标题】:Why does this recursive function return the correct value? [duplicate]为什么这个递归函数返回正确的值? [复制] 【发布时间】:2018-10-19 03:33:22 【问题描述】:

运行一个递归函数,例如这个(在 gcc 7.3.1 中编译):

#include <stdio.h>

int arr[] = 5,1,2,6,7,3;
int arraySize = 6;

int recfind(int value, int index)

    if (arr[index] == value)
        return 1;
    if (index >= arraySize)
        return 0;
    // return recfind(value, ++index);
    recfind(value, ++index);
 

int main() 
    printf("found 6? %d\n", recfind(6, 0));
    printf("found 9? %d\n", recfind(9, 0));

我得到以下输出:

found 6? 1
found 9? 0

为什么会这样?既然没有返回递归recfind调用的结果,那么高层调用的返回值如何选择呢?

【问题讨论】:

函数被指定返回一些东西,但没有。你不知道你怎么能摆脱它吗?不管结果如何? @StoryTeller 是的,这正是我想知道的。 试图讨论undefined behavior的行为是没有意义的。 您的编译器应该对此发出警告。 这是高度相关的***.com/questions/9936011/… 【参考方案1】:

对于 C 部分是来自 N1256 的 6.9.1:

如果到达终止函数的,并且 函数调用被调用者使用,行为未定义。

所以你的程序的行为是undefined。

为什么会这样?

您使用的目标 + 编译器有可能不会篡改包含上次(递归)函数调用的返回值的寄存器。 C 不强制要求这种机制在规范中返回值。

因此,虽然这听起来很合理,但并不能保证。

【讨论】:

这个问题没有问到C++。 @aschepler 它被标记为 C/C++。 @aschepler 确实,我不确定它是 C 还是 C++ 是否会对此有任何影响(如果确实如此,我会对那个轴承到底是什么感兴趣) @gandalf3 在 C 函数中按值返回可能不会返回只要调用者不使用返回值。在 C++ 中,调用者是否使用返回值并不重要,如果函数没有返回,则行为未定义。

以上是关于为啥这个递归函数返回正确的值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Swift 在递归函数中没有返回正确的值

为啥我们需要在这个递归函数中返回

为啥我的递归函数返回 None?

为啥我的递归函数返回 None?

算法递归

PHP递归函数返回值