【问题标题】:Lack of return statement in recursive function, still works [duplicate]递归函数中缺少返回语句,仍然有效[重复]
【发布时间】:2019-03-26 14:15:10
【问题描述】:

我参加了 CS 课程,我们正在学习递归。老师向我们展示了一些代码,我想知道它为什么有效。 buscar 是数组 v[] 中的递归搜索函数。它返回 x 在 v[]

中的位置
int buscar(int x, int v[], int n) {
    if(n == 0) return -1;
    if(x == v[n-1]) return n-1;
    buscar(x, v, n-1);
}

int main() {
    int v[] = {5, 3, 9, 12};
    printf("%d\n", buscar(5, v, 4));
}

这里的问题是

buscar(x, v, n-1);

它不应该返回“nothing”并以一些错误终止吗? 当我运行这个程序时,结果是正确的。为什么和

一样
return buscar(x, v, n-1);

【问题讨论】:

  • 不要想知道为什么未定义的行为会起作用。
  • 这不是 C 语言的工作方式:您通常永远无法通过运行程序来证明它是正确的。确保程序正确的唯一方法是证明它遵循规则。
  • 你是对的。应该有return buscar(x, v, n-1);。例如,在 C# 中,这不会编译,编译器会说:“并非所有代码路径都返回值”

标签: c recursion


【解决方案1】:

正如其他人评论的那样,您的代码显示出未定义的行为。

您“意外”(或偶然)得到您期望的结果的事实可能是不同级别的函数使用相同的处理器寄存器返回函数结果的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-24
    • 2013-03-10
    • 2014-09-22
    • 2020-05-28
    • 1970-01-01
    • 2013-03-21
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多