1

我正在做一些练习,以便我可以通过递归的东西。其中之一是我试图用递归重写线性搜索。这里是:

int linearSearch(int a[], int n, int key)
{
    if (n < 0 ) 
    {
          return -1;
    }
    if(key == a[n-1])
    {
           return n - 1;
    } 
    linearSearch(a, n-1, key); // Line 1
}

如果没有return语句,则代码无法正确执行。我不明白为什么我们需要将return语句放在第 1 行?在这种情况下,我们需要递归调用只是为了将 n 减 1 吗?

4

4 回答 4

5
linearSearch(a, n-1, key); // Line 1

您应该return从递归调用中获取值:

return linearSearch(a, n-1, key);

否则,答案不会冒泡到函数的第一次调用,并且不会作为“答案”返回给原始调用者。

n-1返回或-的基本子句-1只是将它返回给它们的调用者,这是同一个函数!但如果不从那里返回它,它就永远不会到达原来的调用者。

于 2012-04-16T07:50:09.580 回答
1

对于 n = 0 ,以下行可能会崩溃(或产生意外值):

if(key == a[n-1])

您应该将第一个 if 语句更改为:

if (n <= 0 ) 
于 2012-04-16T07:54:59.277 回答
0

您不能调用具有某种返回类型的函数而不将其分配给变量。在第 1 行,linearSearch(a, n-1, key); 作为函数的语句具有返回类型,因此该语句无效。你应该写return linearSearch(a, n-1, key);在第 1 行。

于 2012-04-16T09:33:28.713 回答
0

想象一下这个功能(也许有帮助)

int fortytwo(void) {
    if (0) return 0; /* make the compiler less sad */
    42;
}
于 2012-04-16T09:40:30.587 回答