如何将循环函数的迭代 STL 列表转换为递归?
How do I turn an iterative STL List for loop function into a recursion?
所以我在 class 成员函数中有一个简单的 for 循环,它打印大学想要录取的学生的姓名。 StudentPreferenceList 和 SchoolName 是 class 成员变量,而 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
这是一个通用架构,带有简短的占位符名称。
给定一个迭代如下:
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
.
所以我在 class 成员函数中有一个简单的 for 循环,它打印大学想要录取的学生的姓名。 StudentPreferenceList 和 SchoolName 是 class 成员变量,而 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
这是一个通用架构,带有简短的占位符名称。
给定一个迭代如下:
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
.