[英]How do I turn an iterative STL List for loop function into a recursion?
所以我在類成員函數中有一個簡單的 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
這是一個通用架構,帶有簡短的占位符名稱。
給定如下迭代:
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.