【问题标题】:How do I turn an iterative STL List for loop function into a recursion?如何将循环函数的迭代 STL 列表转换为递归?
【发布时间】:2019-03-09 06:42:30
【问题描述】:

所以我在类成员函数中有一个简单的 for 循环,它打印大学想要录取的学生的姓名。 StudentPreferenceList 和 SchoolName 是类成员变量,而 ostr 是我要写入输出的文件。

void School::printSchoolPreferences(std::ostream &ostr) const{

    std::list<std::string>::const_iterator name;
    ostr << SchoolName + " preference list:"<< std::endl;
    int rank = 1;

    for (name = SchoolPreferenceList.begin(); name != 
         SchoolPreferenceList.end(); name++){

         ostr << "  " << rank << ". " << *name << std::endl;
         rank++;
    }

}

我现在正在尝试将此函数转换为递归函数,这就是我目前所拥有的。我目前在下面的尝试遇到了很多编译错误,如果您能帮我弄清楚如何解决它,我将不胜感激。谢谢。

void School::func(int rank, std::list<std::string>::const_iterator 
                  name_rank, std::ostream &ostr){

     if (rank < SchoolPreferenceList.size()){
         ostr << "  " << rank << ". " << *name_rank << std::endl;
         func(rank++, name_rank++, ostr);
     }
}

void School::printSchoolPreferences(std::ostream &ostr) const{

    std::list<std::string>::const_iterator name;
    ostr << SchoolName + " preference list:"<< std::endl;

    int rank = 1;
    func(rank, name_rank, ostr);
}

这是预期的输出:

 university_of_michigan preference list:
   1. erin_jones
   2. john_smith
   3. joe_miller
   4. dave_roberts

【问题讨论】:

  • 你没有初始化name_rank(并且在你使用name时有错字)。
  • “得到很多编译错误”。所以提供一些。
  • 只是好奇,为什么要将非递归代码转换为递归代码?
  • @aschepler 额外积分

标签: c++ list recursion stl listiterator


【解决方案1】:

这是一个通用架构,带有简短的占位符名称。

给定一个迭代如下:

void do_something(const Container& c)
{
    // preamble
    for (auto it = c.begin(); it != c.end(); ++it)
    {
        // per-loop action on *it
    }
}

可以编写如下递归:

void do_aux(Container::const_iterator first, Container::const_iterator last)
{
    if (first == last) return;

    // per-loop action on *first

    ++first;
    return do_aux(first, last);
}

void do_something(const Container& c)
{
    // preamble
    do_aux(c.begin(), c.end());
}

请注意,这是很好的尾递归,它显示了迭代和尾递归的本质等价。辅助函数do_aux 代替循环,包括检查循环条件和中断。循环体中所需的前导码中的其他状态可以通过其他参数传递给do_aux

【讨论】:

  • 请注意,这主要是 OP 所做的。 (糟糕的开始,缺少初始化)。
  • 谢谢!我修复了我糟糕的初始化并使用了你的格式,它就像一个魅力。
猜你喜欢
  • 2021-01-03
  • 2015-01-08
  • 1970-01-01
  • 2021-07-06
  • 2021-06-18
  • 2020-08-08
  • 2015-05-30
相关资源
最近更新 更多