为什么当我<0时,我的while循环没有终止?

时间:2020-04-05 22:12:14

标签: c++ loops recursion while-loop

很抱歉出现菜鸟问题。 我的班级有以下代码用于作业(包括作业说明):

编写一个程序,要求用户输入字符串,然后将其传递给void递归函数,该函数将反向显示字符串。该函数的原型为:

void reverse(string s, int i);

函数调用为:

reverse(strIn, strIn.length());

典型的运行是:

输入一个字符串:

四分和七年前..

.. oga sraey neves dna erocs ruoF

// Actual code
#include <iostream>
#include <string>

void reverse(std::string, int);

int main() {
  std::string input;

  std::cout << "Enter a string." << std::endl;

  getline(std::cin, input);

  int i = input.length() - 1;

  reverse(input, i);

  return 0;
}

void reverse(std::string input, int i) {
  while (i >= 0) {
    std::cout << input.at(i);
    i--;
    reverse(input, i);
  }
}

我假设每次都减1会显示字符串中的最后一个字符,并将循环条件设置为i >= 0会使字符串中没有更多字符时循环终止。但是我得到以下输出:

sleepy@mooncell ~/CMPSC121/Activities $ ./a.out
Enter a string.
help
plehhehhlehhehh

我无法弄清楚我在做什么错。非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这是因为您正在尝试同时执行递归和while循环,只需摆脱while循环即可,它将起作用,代码应如下所示:

// Actual code
#include <iostream>
#include <string>

void reverse(std::string, int);

int main() {
    std::string input;
    std::cout << "Enter a string." << std::endl;
    getline(std::cin, input);
    int i = input.length() - 1;
    reverse(input, i);
    return 0;
}
void reverse(std::string input, int i) {
    if(i <0)
        return;
    std::cout << input.at(i);
    i--;
    reverse(input, i);
}

答案 1 :(得分:0)

此功能

void reverse(std::string input, int i) {
  while (i >= 0) {
    std::cout << input.at(i);
    i--;
    reverse(input, i);
  }
}

不是纯递归的,因为它使用while循环。

通过值传递字符串也是一个坏主意。字符串中的位置应为std :: string :: size_type。

第二个参数可以具有默认参数。在这种情况下,函数调用看起来会简单得多

reverse( input );

请注意,当将空字符串传递给函数时,这些语句会调用未定义的行为

int i = input.length() - 1;

reverse(input, i);

因为在这种情况下变量i将具有最大值。就是这个声明

int i = input.length() - 1;

实际上等同于

int i = std::string::size_type( -1 );

您需要的是以下

void reverse( const std::string &s, std::string::size_type i = 0 ) 
{
    if ( i < s.size() )
    {
        char c = s[i];
        reverse( s, i + 1 );
        std::cout << c;
    }
}

这是一个演示程序。

#include <iostream>
#include <string>

void reverse( const std::string &s, std::string::size_type i = 0 ) 
{
    if ( i < s.size() )
    {
        char c = s[i];
        reverse( s, i + 1 );
        std::cout << c;
    }
}

int main() 
{
    const char *s = "Hello bbchan";

    std::cout << s << '\n';

    reverse( s );

    std::cout << '\n';

    return 0;
}

其输出为

Hello bbchan
nahcbb olleH

更好的是,按照下面的演示程序中所示的方法来定义函数。在这种情况下,您可以例如以相反的顺序在文件中写入一个字符串。

#include <iostream>
#include <string>

std::ostream & reverse( const std::string &s, 
                        std::string::size_type i = 0, 
                        std::ostream &os = std::cout ) 
{
    if ( i < s.size() )
    {
        char c = s[i];
        reverse( s, i + 1, os );
        os << c;
    }

    return os;
}

int main() 
{
    const char *s = "Hello bbchan";

    std::cout << s << '\n';

    reverse( s ) << '\n';

    return 0;
}