C ++中调用和返回递归函数的区别

时间:2015-08-02 18:52:29

标签: c++ recursion

有人可以用一个简单的例子来解释在c ++中调用和返回递归函数之间的区别究竟是什么?

这是我的代码,它试图以递归方式在字符串中查找字符。当我调用find()时它工作正常;该函数显示一个整数值,但是,当我编码return find(letter,word)时,它会将正确的结果提供为1或0.谢谢

 bool find(char f,string str)
    {
        static int len = str.length() - 1;
        static int count = 1;
        if (len<0)
        {
            return false;
        }
        else
        {

        if (str[len] == f)
        {
            return true;
        }
        else
        {
            len--;
            return find(f, str);
        }
        }
    }

2 个答案:

答案 0 :(得分:0)

您不会返回返回通话结果的功能。 这是递归的基本示例:

unsigned int factorial(unsigned int n)
{
  if (n == 0)
    return 1;
  return n * factorial(n - 1);
}

如果我们用n == 2调用该函数,程序将执行:

1)factorial(2)=&gt;返回2 *阶乘(1); //它用n == 1调用factorial,进行乘法,然后返回结果。

2)factorial(1)=&gt;返回1 * factorial(0); //在这里与n == 0相同

3)factorial(0)=&gt;返回1; //从这里开始,程序将从带有结果的调用中返回

4)factorial(1)=&gt;返回1 * 1; =&GT;返回1;

5)factorial(2)=&gt;返回2 * 1; =&GT;返回2;

很少有其他事情:请注意,在使用static int len时,您的代码只会运行一次,而count是一个无用的变量。

答案 1 :(得分:0)

函数签名表示返回值,因此您需要将函数调用嵌入到函数返回的返回语句中,尤其是当这两个if条件都不为真时。

考虑以下代码(OP提供的变体):

#include <iostream>
using namespace std;

int find(char f,string str) {
    static int len = str.length() - 1;
    static int count = 1;
    int temp = 0;

    if (len < 0) {
        cout << count << "\n";
        return -99;
    }
    else
    if ( str[len] == f) {
        return len;
    }

    len--;
    count++;
    temp = find( f, str );
    cout << temp << "\n";
    return temp;
}

int main() {
   char ch = 'z';
   int res = find(ch,"I");
   if (res < 0) {
      cout << "Letter '" << ch << "' was not found";
   }
   return 0;
}

请参阅demo

请注意,当找不到字母时,find()的返回值为-99。该值由find()中的 temp 捕获,然后函数返回temp的值。

现在,考虑main() - 它的签名也表示返回值,尽管它被丢弃了。如果您尝试执行代码而不在main()中返回某种整数,则执行将存在缺陷。

因此,无论是否以递归方式使用函数,如果函数的签名指示返回值,则需要返回期望类型的值。由于find()可能返回-99或找到的字母的位置,因此当它执行时,它将被评估为将通过return语句返回的这两个值之一。