我正在尝试实现二叉搜索树并尝试实现从节点中搜索值。 这本书通过递归来实现它。
为了更好地理解这个过程,我试图在数组上应用逻辑。
请考虑以下代码:
#include <iostream>
#include "BST.h"
using namespace std;
char Array[]={'A','B','C','D','E','F','G','H','I','J'};
char fn(int i,int x)
{
if( i == x)
{
cout << "Case : 1 " << endl;
return Array[x];
}
else if( i > x)
{
cout << "Case : 2 " << endl;
fn(--i,x);
}
else if(i < x)
{
cout << "Case : 3 " << endl;
fn(++i,x);
}
}
int main()
{
cout << fn(2,7) << endl ;
system("Pause");
return 0;
}
我想要实现的是fn(int i,int x): from index i , search index x and return the value at index x
。
The output is:
Case : 3
Case : 3
Case : 3
Case : 3
Case : 3
Case : 1
H
Press any key to continue . . .
递归逻辑工作正常。但是在编译时,它会将警告显示为main.cpp(28): warning C4715: 'fn' : not all control paths return a value
因此,如果我将代码修改为:
char fn(int i,int x)
{
if( i == x)
{
cout << "Case : 1 " << endl;
return Array[x];
}
else if( i > x)
{
cout << "Case : 2 " << endl;
return fn(--i,x);//added return here
}
else if(i < x)
{
cout << "Case : 3 " << endl;
return fn(++i,x);//added return here
}
}
没有编译警告,输出完全相同。我的问题是what purpose does return in each 'else if test condition' serve, I am returning from my base condition i.e. return Array[x]; and this is what I wanted my function to return. Why to put return in all the test conditions?
修改
刚刚意识到,第二个版本的函数仍在提供编译警告main.cpp(30): warning C4715: 'fn' : not all control paths return a value
应该做什么?如何解决?
答案 0 :(得分:1)
我的问题是,在每个'else if if'服务中返回的目的是什么,我从我的基本条件返回,即返回Array [x];这就是我希望我的功能返回的原因。为什么要在所有测试条件下进行返回?
这会将基本案例中的值最终返回到递归调用的最高级别。
为了更好地理解这一点,请记住return
只是将执行返回给调用fn()
的函数。当递归调用fn()
时,调用者和被调用者都是fn()
函数的副本。您可以递归调用fn()
多次,每次递归调用必须将结果返回给它的父级,并最终返回到最初调用fn()
的函数。
我建议你拿一张纸和一支铅笔,通过一个示例输入手动工作。跟踪fn()
的每个递归调用以及从每个调用返回时会发生什么。手动执行此操作后,使用调试器逐步执行代码,以检查它是否按预期方式工作。
答案 1 :(得分:0)
如果return
和fn(--i, x)
之前没有fn(++i, x)
,则该函数不会从这些语句返回。它尝试运行函数可能具有的任何其他语句。但是,没有。它到达函数的末尾而不会遇到return
语句。
返回类型不是void
的函数必须具有有效的return
语句。否则,代码的行为是未定义的。您可以在https://stackoverflow.com/a/1610454/434551了解更多相关信息。
编译器通过报告警告来帮助您避免该问题。