下面是day13所學的知識點:
函式遞迴
迭代
1.什麼是遞迴
程式呼叫自身的程式設計技巧稱為遞迴( recursion)。 遞迴做為一種演算法在程式語言中廣泛應用。
乙個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量。 遞迴的主要思考方式在於:把大事化小
2.遞迴的兩個必要條件
<1>存在限制條件,當滿足這個限制條件的時候,遞迴便不再繼續。
<2>每次遞迴呼叫之後,越來越接近這個限制條件
先來看一道例題:編寫函式不允許建立臨時變數,求字串長度。
先用建立臨時變數的方法:
//這裡是test.h
//預處理符,防止標頭檔案被重複包含
#ifndef _test_h_
#define _test_h_
#include
#include
mystrlen
(const
char
*str)
;#endif
//這裡是test.c
#include
"test.h"
mystrlen
(const
char
*str)
return i;
//while第二種寫法
/*int count = 0;
while (*str != '0')
*/}//這裡是main.c
#include
"test.h"
intmain()
再使用遞迴的方法:
這裡的test.h和main.c的**與上面相同
//這裡是test.c
#include
"test.h"
mystrlen
(const
char
*str)
return1+
mystrlen
(str +1)
;}
過程**:
再看一道例題:接受乙個整型值(無符號),按照順序列印它的每一位,例如,輸入1234,列印出1 2 3 4
方法一:迴圈 陣列
思路:x % 10可以計算出最後一位(1234中的4),再利用x/10取出123,再轉回來求出3,依次迴圈。全部取出後利用陣列儲存起來,利用另乙個迴圈將4 3 2 1倒敘輸出。
//這裡是test.h
#ifndef _tset_h_
#define _test_h_
#include
#include
#pragma warning (disable:4996)
void
showint()
;#endif
//這裡是test.c
void
showint
(int x)
;int i =0;
while
(x >0)
while
(i >0)
}//這裡是main.c
#include
"test.h"
intmain()
方法二:遞迴一
思路:先判斷輸入的值是否為 <10的數字,如果不是,進入x/10的遞迴,直到x<10,輸出1,這時候遞迴函式的呼叫開始返回,利用x%10列印2 3 4
//這裡是test.h
#ifndef _tset_h_
#define _test_h_
#include
#include
#pragma warning (disable:4996)
void
showint()
;#endif
//這裡是test.c
void
showint
(int x)
showint
(x /10)
;printf
("%d "
,x %10)
;}//這裡是main.c
#include
"test.h"
intmain()
方法三:遞迴二
思路:判斷輸入的數是否》9,如果是,直接進行遞迴,直到x<9,直接取餘,這裡因為1的取餘還是1,所以1和後面12,123,1234,是一種型別的。
test.c中執行printf("%d ",x % 10);,有兩種情況,一種是if條件不滿足,另一種是if條件滿足了,但是內部函式呼叫返回了。
//這裡是test.h
#ifndef _tset_h_
#define _test_h_
#include
#include
#pragma warning (disable:4996)
void
showint()
;#endif
//這裡是test.c
void
showint
(int x)
printf
("%d "
,x %10)
;}//這裡是main.c
再看乙個例子:用遞迴求乙個數的階乘
#ifndef _tset_h_
#define _test_h_
#include
#include
#pragma warning (disable:4996)
intshowint()
;#endif
第一種寫法
intshowint
(int x)
return1;
}第二種寫法
intshowint
(int x)
return x*
showint
(x -1)
;#include
"test.h"
intmain()
再看乙個例子:用遞迴求斐波那契數
#ifndef _tset_h_
#define _test_h_
#include
#include
#pragma warning (disable:4996)
intshowint()
;#endif
intshowint
(int x)
return
showint
(x-1)+
showint
(x-2);
}#include
"test.h"
intmain()
由此看出,遞迴效率低,因為多次計算,多次開闢棧幀,耗時耗記憶體,如果次數過多,程式會崩,也就是棧溢位問題。此時用迭代,效率更高:
int first =1;
int second =1;
int third =1;
while
(n >2)
return third;
day15 C語言初階 一維陣列
下面是day15所學到的知識 涵蓋知識點 一維陣列的建立和初始化 一維陣列的使用 一維陣列在記憶體中的儲存 一維陣列的建立和初始化 1 陣列的定義 陣列是一類相同型別元素的集合。2 陣列的建立 type t arr name 常量 type t 是指數組的元素型別 常量是用來指定陣列的大小。陣列建立...
C語言初階 函式
數學中我們常見到函式的概念。但是c語言中的函式是什麼呢?維基百科中對函式的定義 子程式 c語言中函式的分類 庫函式自定義函式 為什麼會有庫函式?開發效率高 穩定性好。這裡我們簡單的看看 www.cplusplus.com 簡單的總結,c語言常用的庫函式都有 自定義函式和庫函式一樣,有函式名,返回值型...
C語言初階攻略 二
一入 深似海,從此妹紙是路人.前面為大家做了一些簡單的介紹,這部分會帶來一些語句和關鍵字等.一 選擇語句 主要是根據判斷條件,不同的觸發條件觸發不同的結果.比如 如果下雨,就需要打傘,不下雨也就不需要打傘了.二 迴圈語句 while 條件 for 迴圈語句 do.while迴圈語句 三 函式 函式可...