簡體   English   中英

這個遞歸函數如何自動轉換為迭代函數?

[英]How is this recursive function automatically converted into iterative function?

我正在閱讀尾遞歸,如下所示

尾遞歸是指最后一行的遞歸調用。 通過將主體包含在while循環中並用每個函數參數的一個賦值替換遞歸調用,可以機械地消除尾遞歸

例如

void print(Iterator start, Iterator end, ostream& out=cout) {
  if(start == end)
      return;
  out << *start++ << endl;
  print(start, end, out);
}

通過上述規范轉換為迭代

void print(Iterator start, Iterator end, ostream& out=cout) {
   while(true) {
      if(start == end)
          return;
      out << *start++ << endl;
    }
}

在上面的段落中提到“用每個函數參數用一個賦值替換遞歸調用,但在給定的例子中我們沒有任何賦值?

任何人都可以解釋並提供有關如何將遞歸轉換為迭代函數的上述解釋示例嗎?

賦值隱藏在增量運算符中:

start++;

實際上是一項任務:

start = start+1;

實際上,這個例子(第一部分)並不是很好。

out << *start++ << endl;
print(start, end, out);

應該

out << *start << endl;
print( start+1, end, out);

我不認為,無論你指的是什么段落都很重要; 只關注主要問題,你想將遞歸函數轉換為正常的迭代函數,這可以(毫不費力地)完成,

void print(Iterator start, Iterator end, ostream& out=cout) {
   while(start != end) {
      out << *start++ << endl;
    }
}

它在C ++中隱藏了一點,但是start++在循環中每次都分配一個新值。

他們所說的是,你將tail函數調用的參數賦值給這個函數調用的參數變量,但是在這種情況下它不是必需的,因為你用相同的參數調用函數(因為像其他人一樣)說,第一個參數的更改start發生在函數調用之前)。

實際上,如果精確地完成,迭代函數應該看起來像

void print(Iterator start, Iterator end, ostream& out=cout) {
    while(true) {
        if(start == end)
            return;
        out << *start++ << endl;

        start = start;
        end = end;
        out = out;
    }
}

但是這些任務完全是不必要的,即使是在視覺上是正確的。

遞歸到迭代的一般轉換看起來像這樣。

原始代碼:

void print(Iterator start, Iterator end, ostream& out=cout) {
  if(start == end)
      return;
  out << *start++ << endl;
  print(start, end, out);
}

轉換代碼:

void print(Iterator start, Iterator end, ostream& out=cout) {
  while(true) {
     if(start == end)
        return;
     out << *start << endl;

     // One assignment per function argument for 'general' tail recursion
     start = start + 1;       // (1)
     end = end;               // (2)
     out = out;               // (3)
  }
}

包括如解釋中的三個任務。 賦值(1)嵌入在start++ ,賦值(2)和(3)被優化掉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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