【问题标题】:c++ programming iteration and recursionc++编程迭代和递归
【发布时间】:2012-10-22 15:36:34
【问题描述】:

我正在寻找一些关于家庭作业的快速提示。我们遇到了一些问题,并且必须编写两个快速程序来说明如何使用迭代和递归中的一个来解决这些问题。我敢肯定这比我想象的要容易,但是我很容易对这两者感到困惑。我不希望任何人为我完全解决问题,我不会学到任何东西!但是,如果你能看看我到目前为止所拥有的,让我知道我是否朝着正确的方向前进。此外,代码不需要编译,我们的教授希望我们对迭代与递归的区别有一个大致的了解。

问题:检查一个字符串是否为回文。

我的解决方案——我认为是迭代解决方案:

bool iterative_palindrome (const string& str) {
string line, result;
stack <char> stack_input;

//user enters string, program takes it
cout << "Enter string: " << endl;
while (getline (cin, line) && (line != "")) {

    //push string into stack
    for (size_t i = 0; i < line.size(); i++) {
        stack_input.push(line[i]);

        //create reverse of original string
        while (!stack_input.empty()) {
            result += stack_input.top();
            stack_input.pop();
            return result;
        }
        //check for palindrome, empty string
        if (line == result || line = "0" || line.empty()) {
            return true;
            cout << line << " is a palindrome!" << endl;
        } else {
            return false;
            cout << line << " is NOT a palindrome." << endl;
            cout << "Enter new string: " << endl;
        }
     }
  }
}

我提醒大家,我对这些东西很陌生。我已经读过一些东西,但我仍然很难理解这一点。

【问题讨论】:

  • line = "0" 是赋值而不是比较。另外,return 之后的代码根本不会执行。
  • 是否要求您使用堆栈?你让这变得比它必须的更难。
  • 不一定要使用堆栈,但是我们的教授已经花了很多时间来谈论它们,我只是在查看讲义和幻灯片后才想到这一点。从其他用户的说法来看,您似乎是对的!

标签: c++ algorithm recursion iteration


【解决方案1】:

我认为编写代码是解释这两种方法的最佳方式。这段代码可以理解吗?

bool iterative_palindrome(const string& str) {
    int size = str.size();

    for (int i=0; i<str.size()/2; i++) {
        if (str[i] != str[size-i-1])
            return false;
    }

    return true;
}

你这样称呼它recursive_palindrome(str, 0)

bool recursive_palindrome(const string& str, int index) {
    int size = str.size();

    if (index >= size/2)
        return true;

    if (str[index] == str[size-index-1])
        recursive_palindrome(str, index+1);
    else
        return false;
}

【讨论】:

  • 感谢您的快速回复 - 我可以看到您使用此代码的目的。我对迭代解决方案中的部分感到有些困惑:“size()/2” - 为什么我们要除以 2?另外,在 if 语句中,为什么要减去 [size-i-1]?
  • 我除以 2 是因为您只需要进行 size/2 比较(字符串的一半与另一半进行比较)。索引是 size-i-1 ,因为它从字符串的末尾倒数。 (记住字符串的第一个索引是0,而不是1,所以我需要减1)。希望这可以澄清它。
【解决方案2】:

大致思路如下:

迭代: 初始化两个指针,一个指针指向字符串的开始和结束。

  1. 比较指出的字符,如果不同 -> 不是回文。
  2. 增加开始指针,减少结束指针。
  3. 重复直到开始指针 >= 结束指针。

递归(在这种情况下比迭代更难):

结束条件:长度为零或一的字符串是回文。

如果第一个和最后一个字符相同并且没有第一个和最后一个字符的字符串是回文,则字符串是回文。

您可以通过传递指向字符串中第一个和最后一个字符的指针来更有效地实现这种递归算法,而不是在递归之间复制字符串。

希望这会有所帮助:-)

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 2016-01-05
    • 1970-01-01
    • 2016-09-22
    • 2011-05-11
    • 2019-06-20
    • 2021-12-24
    • 2015-04-20
    • 2016-06-14
    相关资源
    最近更新 更多