簡體   English   中英

如何將循環函數的迭代 STL 列表轉換為遞歸?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM