繁体   English   中英

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

[英]Why does this recursive function return the wrong value?

在构建递归函数时,我继续遇到问题,该函数的返回值与我期望它返回的值不同。 我相当确定它与函数的递归性质有关,但是我不知道发生了什么。

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值。给定字符串“ testing”且没有整数,我希望递归函数为每个调用增加numberToReturn并将新值传递给下一个电话。 这一定是正确的,因为如果在达到基本情况时我退出numberToReturn,我将获得期望值(在这种情况下为7)。 但是,只要我返回该值,它就会更改为更大的数字(在我的情况下为6422160)。

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

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

您的函数必须始终以return结尾,否则,函数将返回一些随机的未初始化值。 例如

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();
}

您真正想要的是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM