递归中的return语句:C ++

时间:2014-09-30 04:31:19

标签: c++ recursion

我正在尝试实现二叉搜索树并尝试实现从节点中搜索值。 这本书通过递归来实现它。

为了更好地理解这个过程,我试图在数组上应用逻辑。

请考虑以下代码:

#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 应该做什么?如何解决?

2 个答案:

答案 0 :(得分:1)

  

我的问题是,在每个'else if if'服务中返回的目的是什么,我从我的基本条件返回,即返回Array [x];这就是我希望我的功能返回的原因。为什么要在所有测试条件下进行返回?

这会将基本案例中的值最终返回到递归调用的最高级别。

为了更好地理解这一点,请记住return只是将执行返回给调用fn()的函数。当递归调用fn()时,调用者和被调用者都是fn()函数的副本。您可以递归调用fn()多次,每次递归调用必须将结果返回给它的父级,并最终返回到最初调用fn()的函数。

我建议你拿一张纸和一支铅笔,通过一个示例输入手动工作。跟踪fn()的每个递归调用以及从每个调用返回时会发生什么。手动执行此操作后,使用调试器逐步执行代码,以检查它是否按预期方式工作。

答案 1 :(得分:0)

如果returnfn(--i, x)之前没有fn(++i, x),则该函数不会从这些语句返回。它尝试运行函数可能具有的任何其他语句。但是,没有。它到达函数的末尾而不会遇到return语句。

返回类型不是void的函数必须具有有效的return语句。否则,代码的行为是未定义的。您可以在https://stackoverflow.com/a/1610454/434551了解更多相关信息。

编译器通过报告警告来帮助您避免该问题。