菜雞日記 C語言學習之函式 2

2021-10-17 05:17:56 字數 1903 閱讀 5542

自己呼叫自己,感覺和迴圈差不多。但是有些問題遞迴更好理解,迴圈不太好理解。但是遞迴需要的空間更多。因為每次呼叫自己都要開闢一塊新的空間。

什麼情況下可以用遞迴?

​ 解決問題的思路,轉化為問題本身類似的問題時, 可以採用遞迴

​ 是不是所有的遞迴問題,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工作過程的簡要描述...