我正在做一些练习,以便我可以通过递归的东西。其中一个是我试图用递归重写线性搜索。这是:
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吗?
答案 0 :(得分:5)
linearSearch(a, n-1, key); // Line 1
你应该return
来自递归调用的值:
return linearSearch(a, n-1, key);
否则,答案不会冒泡到函数的第一次调用,也不会作为原始调用者的“回答”返回。
返回n-1
或-1
的基本子句 - 只是将其返回给调用者,这是相同的函数!但是如果没有从那里返回它,它将永远不会到达原来的来电者。
答案 1 :(得分:1)
对于n = 0,以下行可能会崩溃(或产生意外的值):
if(key == a[n-1])
你应该将你的第一个if语句改为:
if (n <= 0 )
答案 2 :(得分:0)
如果函数没有将其赋值给变量,则无法调用具有某种返回类型的函数。第1行中的陈述linearSearch(a, n-1, key);
由于函数具有返回类型,因此该语句无效。
你应该在第1行写下return linearSearch(a, n-1, key);
。
答案 3 :(得分:0)
Imagina这个功能(也许有帮助)
int fortytwo(void) {
if (0) return 0; /* make the compiler less sad */
42;
}