很久沒時間發筆記了,這次抽空 sky(我的昵稱) 再為大家講解一個東東,講的不好之處大神勿噴哈
#include<iostream>
using namespace std;
void bin(const unsigned int &i)
{
if (i/2)
bin(i/2);
cout << i%2;
}
int main()
{
int a;
cin >> a;
bin(a);
cout << endl;
return 0;
}
這是一個求一個數的二進制的程序,
對於這樣的遞歸函數大家肯定不陌生,但是相信很多人還是不清楚它的執行過程吧,或者誤以為自己想的是對的,下面我將為大家解答:
遞歸函數是如何結束的呢?就是遞歸函數結束的標志,在本程序中,遞歸函數結束的標志就是if(i/2)為假,
則遞歸函數結束。
程序執行是這樣的,如果傳進來的數是6,那麼第一次if()判斷為真,則執行bin(i/2),執行完後還會執行cout << i%2;不過這一句只是將它入棧了,不會在屏幕上面輸出,這樣才是遞歸函數第一次進行遞歸,第二次進入的時候會把第二次的cout << i%2;入棧,以此類推,直到當判斷到if()為假的時候,這時遞歸才會結束,此時開始出棧,棧是先進後出,所以才是先輸出最後執行的cout << i%2;
很多人都認為第一次執行bin()的話就不會執行cout << i%2;了,這樣的理解是錯誤的,因為遞歸就是在反復地調用函數本身,調用函數就是一個入棧的過程,如果實在不理解的話大家可以把程序反匯編一下看下編譯器執行的過程就知道了。