C語言 遞迴練習合集

2021-10-02 17:59:45 字數 3573 閱讀 3814

#include 

#include

1.遞迴和非遞迴分別實現求第n個斐波那契數。

遞迴

int

fib1

(int n)

else

if(n ==2)

else

}

非遞迴 (畫儲存圖更易理解)

int

fib2

(int n)

return c;

}

int main()
2.編寫乙個函式實現n^k,使用遞迴實現

//遞迴

int

exponent_1

(int n,

int k)

else

//非遞迴

int

exponent_2

(int n,

int k)

return num;

}

void main()
思考:遞迴似乎有乙個好處,就是不用申請多餘的變數來存放返回值,而是由遞迴函式的引數表示式直接帶出。

3. 寫乙個遞迴函式digitsum(n),輸入乙個非負整數,返回組成它的數字之和

//例如,呼叫digitsum(1024),則應該返回1 + 0 + 2 + 4,它的和是7

//遞迴

int

digitsum_1

(int n)

return0;

}

//非遞迴

int

digitsum_2

(int n)

while

(n);

return sum;

}

4. 編寫乙個函式 reverse_string(char * string)(遞迴實現)

//實現:將引數字串中的字元反向排列。

//要求:不能使用c函式庫中的字串操作函式。

void

reserve_string

(char

* str)

//二 只有edcb

/*if (*str != '\0') */

//三 只有edcb,因為指標指向變了

/*if (*str != '\0') */

//四 0x003f5929 處有未經處理的異常: 0xc00000fd: stack overflow (引數: 0x00000001, 0x008e2f70)

/*if (*str != '\0') */

printf

("%c "

,*str)

;}

思考:還是沒搞懂,怎麼檢查才能發現問題所在

第二、三種**:str指標變化,導致直接指向 b

第四種**:未經處理的異常: 0xc00000fd: stack overflow

拓展:

#include 

#define ndebug

#include <

assert

.h>

#include

int

strlength

(char

* string)

return count;

}

啊啊啊啊啊啊啊啊啊……遇到字串逆序還是好繞啊!!

5.遞迴和非遞迴分別實現strlen

遞迴

int

strlen_1

(char

*str)

else

}

非遞迴

int

strlen_2

(char

* string)

return count;

}

思考:對比第四題遞迴實現的函式 reverse_string(char * string) 中的 str++,為什麼結果是正確的,是因為遞迴和非遞迴的區別導致的嗎?

int

strlen_3

(char str)

思考:為什麼直接寫 for (int i = 0; str[i] != 『\0』; i++) 會報錯變數 i 是未定義,未宣告的識別符號?

int

strlen_4

(char

*str)

思考:陣列和指標的界限比較模糊,最後一種非遞迴方法不太好嗎?

6.遞迴和非遞迴分別實現求n的階乘

遞迴

int

factorial_1

(int n)

else

}

非遞迴

int

factorial_2

(int n)

else

return num;

}}

思考:由該題目的兩種**可以發現,非遞迴方法好像就是將遞迴轉化為迴圈

7.遞迴方式實現列印乙個整數的每一位

void

print

(int x)

}void

main()

語句執行順序:

進入print(204)

—》 num = 4, x = 20, 進入print(20)

—》num = 0, x = 2, 進入print(2)

—》 num = 2, x = 0, 進入print(0)

—》 //do nothing//, 結束print(0);

返回print(2)過程, 緊接著print(0)語句後面列印 num=2, 結束print(2);

返回print(20)過程, 緊接著print(2)語句後面列印 num=0, 結束print(20);

返回print(204)過程, 緊接著print(20)語句後面列印num=4, 結束print(204)

—》完成每一位的列印

如果將上述**寫成:

void

print

(int x)

printf

("%d "

, num)

;}

則會提示錯誤:

run-time check failure #3 - the variable 'num' is being used without being initialized.
這是為啥嘞? 求解 >3<

c語言練習題合集2

有乙個3 4的矩陣,要求程式設計序求出其中值最大的那個元素的值,以及其所在的行號和列號。include intmain max a 0 0 for i 0 i 3 i printf 最大的元素是 d,在 d行,在 d列 max,i,j 輸入一行字元,統計其中有多少個單詞,單詞之間用空格分隔開。inc...

C語言練習題 遞迴

會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b1b2 b8,其中b為相應擺法中第i行皇后所處的列數。已經知道8皇后問...

經典簡單C語言合集

乘法口訣表 include includeint main printf n return 0 求100到200間的素數 include includeint main return0 求1000年到2000年之中的閏年 include includeint main return 0 交換兩個整數...