簡體   English   中英

對 C++ 遞歸感到困惑

[英]Confused about C++ recursion

我不明白遞歸如何工作得很好。

void f(int n)
{
  if (n == 1)cout<<1<<" ";
  else
  {
    f(n - 1);
    cout<<n<<" ";
    f(n - 1);
  }

如果我讓 n = 4,這將輸出1 2 1 3 1 2 1 4 1 2 1 3 1 2 1 這是為什么? 首先, n越來越小,直到達到 1,然后,會發生什么? 我無法真正理解這兩個調用的作用,以及為什么第二個調用還在那里,因為第一個調用首先被調用。

遞歸函數的工作方式與非遞歸函數完全一樣。
特別是,當一個返回時,它返回到它的直接調用者。
也就是說,具有n == 1的調用將返回具有n == 2的調用,后者將返回具有n == 3的調用,依此類推,並且調用函數繼續以常規方式運行.

您的示例就像這些非遞歸函數一樣工作,您可能會弄清楚其流程:

void f_1()
{
    cout << 1 << " ";
}

void f_2()
{
    f_1();
    cout << 2 << " ";
    f_1();
}

void f_3()
{
    f_2();
    cout << 3 << " ";
    f_2();
}

void f_4()
{
    f_3();
    cout << 4 << " ";
    f_3();
}

該算法是,當到達遞歸結束時:

  • 打印n
  • 返回並打印調用nn + 1
  • 再次打印前n

這里,遞歸結束時的n1 這就是為什么序列中的每個其他數字都是 1(對應於第 1 點和第 3 點)

如果刪除1 ,則序列為:

2 3 2 4 2 3 2

現在,遞歸“結束”時的n2 (顯然它以1結束,但現在我們要上一層),所以我們重復算法。

如果您刪除2秒...

3 4 3

同樣, 3n ... 而你的最高級別是剩下的4

由於您的對稱算法,您會看到對稱序列:

    f(n - 1);
    cout<<n<<" ";
    f(n - 1);

下面是對正在發生的事情的遞歸解釋。

n下降到n=1if部分開始,打印 1,然后返回。

返回時,我們返回到n的前一次迭代, n = 2 ,現在從else語句的第一行移到第二行,打印 2,然后在第三行,這是另一個重新啟動的遞歸調用n = 2的函數。

所以我們再次通過else的第一條語句,我們得到n = n - 1 = 1

n下降到n = 1if部分開始工作,打印 1,然后返回。

返回時,我們返回到n的前一次迭代, n = 2 ,現在移出else語句的第三行並返回。

返回時,我們回到n的前一次迭代, n = 3 ,現在從else語句的第一行移到第二行,打印 3,然后在第三行,這是另一個重新啟動的遞歸調用n = n - 1 = 2的函數。

所以我們再次通過else的第一條語句,我們得到n = n - 1 = 1

n下降到n = 1if部分開始工作,打印 1,然后返回。

返回時,我們返回到n的前一次迭代, n = 2 ,現在從else語句的第一行移到第二行,打印 2,然后在第三行,這是另一個重新啟動的遞歸調用n = n - 1 = 1的函數。

n下降到n = 1if部分開始工作,打印 1,然后返回。

返回時,我們回到n的前一次迭代, n = 4 ,現在從else語句的第一行移到第二行,打印 4,然后在第三行,這是另一個重新啟動的遞歸調用n = n - 1 = 3的函數。

所以我們再次通過else的第一條語句,我們得到n = n - 1 = 2

所以我們再次通過else的第一條語句,我們得到n = n - 1 = 1

n下降到n = 1if部分開始工作,打印 1,然后返回。

返回時,我們返回到n的前一次迭代, n = 2 ,現在從else語句的第一行移到第二行,打印 2,然后在第三行,這是另一個重新啟動的遞歸調用n = n - 1 = 1的函數。

n下降到n = 1if部分開始工作,打印 1,然后返回。

返回時,我們回到n的前一次迭代, n = 3 ,現在從else語句的第一行移到第二行,打印 3,然后在第三行,這是另一個重新啟動的遞歸調用n = n - 1 = 2的函數。

所以我們再次通過else的第一條語句,我們得到n = n - 1 = 2

所以我們再次通過else的第一條語句,我們得到n = n - 1 = 1

當 n 下降到n = 1if部分開始工作,打印 1,然后返回。

返回時,我們返回到n的前一次迭代, n = 2 ,現在從else語句的第一行移到第二行,打印 2,然后在第三行,這是另一個重新啟動的遞歸調用n = n - 1 = 1的函數。

n下降到n = 1if部分開始工作,打印 1,然后返回。

暫無
暫無

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

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