自己呼叫自己,感覺和迴圈差不多。但是有些問題遞迴更好理解,迴圈不太好理解。但是遞迴需要的空間更多。因為每次呼叫自己都要開闢一塊新的空間。
什麼情況下可以用遞迴?
解決問題的思路,轉化為問題本身類似的問題時, 可以採用遞迴
是不是所有的遞迴問題,c語言都支援呢? 不是的
c語言支援的遞迴,要滿足以下條件:
1):問題本身可以用遞迴解決
2):遞迴不能無限遞迴!!!!要有結束條件
遞迴到一定程度的時候,一定要有跳出遞迴的條件
遞迴 ---- 遞(往下走) ---- 歸(往上走)
c語言是通過什麼機制來支援遞迴呢?
函式棧 棧空間:先進後出
小練習1.寫乙個函式通過遞迴求n!
#include
intfactorial
(int x)
;int
main()
intfactorial
(int x)
else
}
2.寫乙個函式,求出如下問題
有十級階梯,一次可以上一級或者兩級,試問上十級有多少種?
思路:踏上第十級階梯的時候可以從第8階或者第9階踏上去。所以可以轉換成f(10)=f(9)+f(8);那麼同理f(9)=f(8)+f(7);…
所以找到了乙個規律f(n)=f(n-1)+f(n-2);然後f(1)=1;f(2)=2我們是能夠很容易得出的。所以這個問題就可以用遞迴解決了。
#include
intstep
(int x)
;int
main()
return0;
}int
step
(int x)
3.求水窪數
小明家的前面有一塊空地,空地不平,下雨後,就會有水窪
輸入m=5 n=5
1, 0, 1, 0, 1
1, 1, 1, 0, 1
0, 0, 0, 1, 1
0, 1, 1, 1, 0
1, 0, 0, 0, 1
1表示有水1,0表示沒有水
乙個點的水,會和周圍(上下左右)其他點的水連成乙個大水窪(1個)
上述示例中,有4個水窪
思路:如果這個位置上有水,就把這個位置變成0,然後再判斷這個位置的旁邊有沒有水,如果有,就進入,將它變成0,,再判斷旁邊。直到旁邊沒有水為止。
#include
void
charco
(int a[
5],int x,
int y)
;int
main()
,,,,
};for(i=
0;i<
5;i++)}
}printf
("該陣列有%d個水窪\n "
,flag)
;return0;
}void
charco
(int a[
5],int x,
int y)
if(a[x]
[y+1]==
1&&y<4)
if(a[x+1]
[y]==
1&&x<4)
if(a[x]
[y-1]==
1&&y>=1)
}
1.當把陣列傳給函式的時候,傳的是陣列首位址,所以函式和main函式用的是同乙個陣列。在函式裡面改變陣列的值也會改變主函式裡面陣列的值。(傳給函式的引數是乙個位址,函式通過這個位址就能進入陣列,也能夠修改裡面的東西)。
2.如果定義的是乙個全域性變數,函式也能夠進行修改。
C語言學習日記 單鏈表2
首先學習乙個演算法之前,我覺得必須弄清楚演算法的思想,知道它是如何去運作的,都主要分為那些步驟,特別是像遞迴這種重複性比較強的一些步驟操作。在確定好大致的框架之後,就可以具體的落實 了 首先定義函式以及它的相關的引數 這裡之所以要將函式返回值定義為 linklist型的結構指標是因為,下一步想要將修...
c語言學習筆記18之函式2
無參函式 通常用來執行一些功能比較固定單一的語句。例如 getcharar 有參函式 通常通過處理傳遞過來的引數,將函式值返回給呼叫處。如 sqrt 4 pow 2,3 strlen hello 可以將函式比喻成乙個工具,例如我們要割草,此時就需要一把鐮刀,它的功能就是割草。所以要先知道有鐮刀這個東...
菜雞網課組合語言學習筆記 3
當8086cpu要訪問記憶體時,由這四個段暫存器提供記憶體單元的段位址。cs和ip cpu通過cs和ip進行讀取的過程 從cs ip指向記憶體單元讀取指令,讀取的指令進入指令緩衝器 ip ip 所讀取指令的長度,從而指向下一條指令 執行指令。跳轉到第一步並重複整個過程 8080pc工作過程的簡要描述...