[英]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
n
的n + 1
n
這里,遞歸結束時的n
是1
。 這就是為什么序列中的每個其他數字都是 1(對應於第 1 點和第 3 點)
如果刪除1
,則序列為:
2 3 2 4 2 3 2
現在,遞歸“結束”時的n
是2
(顯然它以1
結束,但現在我們要上一層),所以我們重復算法。
如果您刪除2
秒...
3 4 3
同樣, 3
是n
... 而你的最高級別是剩下的4
。
由於您的對稱算法,您會看到對稱序列:
f(n - 1);
cout<<n<<" ";
f(n - 1);
下面是對正在發生的事情的遞歸解釋。
當n
下降到n=1
, if
部分開始,打印 1,然后返回。
返回時,我們返回到n
的前一次迭代, n = 2
,現在從else
語句的第一行移到第二行,打印 2,然后在第三行,這是另一個重新啟動的遞歸調用n = 2
的函數。
所以我們再次通過else
的第一條語句,我們得到n = n - 1 = 1
。
當n
下降到n = 1
, if
部分開始工作,打印 1,然后返回。
返回時,我們返回到n
的前一次迭代, n = 2
,現在移出else
語句的第三行並返回。
返回時,我們回到n
的前一次迭代, n = 3
,現在從else
語句的第一行移到第二行,打印 3,然后在第三行,這是另一個重新啟動的遞歸調用n = n - 1 = 2
的函數。
所以我們再次通過else
的第一條語句,我們得到n = n - 1 = 1
。
當n
下降到n = 1
, if
部分開始工作,打印 1,然后返回。
返回時,我們返回到n
的前一次迭代, n = 2
,現在從else
語句的第一行移到第二行,打印 2,然后在第三行,這是另一個重新啟動的遞歸調用n = n - 1 = 1
的函數。
當n
下降到n = 1
, if
部分開始工作,打印 1,然后返回。
返回時,我們回到n
的前一次迭代, n = 4
,現在從else
語句的第一行移到第二行,打印 4,然后在第三行,這是另一個重新啟動的遞歸調用n = n - 1 = 3
的函數。
所以我們再次通過else
的第一條語句,我們得到n = n - 1 = 2
。
所以我們再次通過else
的第一條語句,我們得到n = n - 1 = 1
。
當n
下降到n = 1
, if
部分開始工作,打印 1,然后返回。
返回時,我們返回到n
的前一次迭代, n = 2
,現在從else
語句的第一行移到第二行,打印 2,然后在第三行,這是另一個重新啟動的遞歸調用n = n - 1 = 1
的函數。
當n
下降到n = 1
, if
部分開始工作,打印 1,然后返回。
返回時,我們回到n
的前一次迭代, n = 3
,現在從else
語句的第一行移到第二行,打印 3,然后在第三行,這是另一個重新啟動的遞歸調用n = n - 1 = 2
的函數。
所以我們再次通過else
的第一條語句,我們得到n = n - 1 = 2
。
所以我們再次通過else
的第一條語句,我們得到n = n - 1 = 1
。
當 n 下降到n = 1
, if
部分開始工作,打印 1,然后返回。
返回時,我們返回到n
的前一次迭代, n = 2
,現在從else
語句的第一行移到第二行,打印 2,然后在第三行,這是另一個重新啟動的遞歸調用n = n - 1 = 1
的函數。
當n
下降到n = 1
, if
部分開始工作,打印 1,然后返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.