为什么这个递归函数返回错误的值?

时间:2018-03-24 17:48:19

标签: c++ recursion

我继续遇到构建递归函数的问题,其返回值与我期望它返回的值不同。我相当肯定它与函数的递归性质有关,但我不明白发生了什么。

int foo(std::string, int = 0);

int main() {
std::string testString = "testing";
std::cout << foo(testString);
}

int foo(std::string givenString, int numberToReturn) {
    if (givenString.length() == 0) {
        std::cout << "Number to return before actually returning: " << numberToReturn << "\n";
        return numberToReturn;
    }
    if (true) {
        numberToReturn++;
    }
    std::string newString = givenString.erase(0, 1);
    foo(newString, numberToReturn);
}

在这个缩小的例子中,我有一个带字符串的函数foo和一个默认值为0的int。给出字符串&#34; testing&#34;并且没有整数,我希望递归函数为每个调用递增numberToReturn并将新值传递给下一个调用。这必须是部分正确的,因为如果我在达到基本情况时输入numberToReturn,我得到预期值(在这种情况下,它将是7)。但是一旦我返回该值,它就会变为更大的数字(在我的情况下为6422160)。

所以说,为什么数字会在返回时发生变化,如何防止这种变化发生或以其他方式返回正确/期望值?

编辑:对于将来遇到类似问题的人,我的问题是每次重新调用都必须返回一些东西,而不仅仅是最后一个。在我的例子中,返回函数foo的最后一行解决了这个问题。不为每个函数调用返回一些内容会导致未定义的行为。

1 个答案:

答案 0 :(得分:-2)

如果您的函数没有返回一些随机未初始化的值,那么您的函数必须始终以return结尾。例如

np.genfromtxt(f, delimiter=',', dtype=None)

大致相当于:

int foo( int x )
{
  if ( x == 0 )
  {
    return x;
  }
  foo(x-1);
}

你真正想要的是:

int foo( int x )
{
  if ( x == 0 )
  {
    return x;
  }
  foo(x-1);
  return someRandomValue();
}