函式遞迴與練習

2021-10-10 04:49:52 字數 2981 閱讀 3848

函式遞迴

遞迴的兩個條件:

1 將問題轉化為其子問題,子問題要與原問題具有相同的解法。限制條件即遞迴的出口,如果限制條件滿足,遞迴程式就可以退出了

2.遞迴的出口

例如 求n個斐波那契數

int

fib(

int n)

else

return

fib(n-1)

+fib

(n-2);

}int

main()

非遞迴的方法

int

fib(

int n)

return third;

}int

main()

函式呼叫

傳參時不論是按照值還是指標方式傳遞,形參拿到的都是實參的乙份拷貝。

形參是在函式呼叫的時候才例項化,才開闢記憶體空間

如果是按照值的方式傳遞,形參和實參各自有各自的空間,改變形參不能改變外部的實參

函式呼叫如果採用傳值呼叫,改變形參不影響實參,因為形參和實參是兩個不同的變數

在c語言中,函式的形參一般都是通過引數壓棧的方式傳遞的

函式宣告和定義

函式必須保證先宣告後使用

函式的定義可以放在任意位置,函式的宣告必須放在函式的使用之前

函式的宣告只是告訴編譯器函式返回值型別、函式名字以及函式所需要的引數,函式定義才是說明函式是怎麼實現的 練習

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

思路//1234->呼叫123->呼叫12->呼叫1

// | | | |

//(1 2 3 4) (1 2 3) (1 2) (1)

void

print

(int n)

printf

("%d "

, n %10)

;}intmain()

2.遞迴和非遞迴分別實現求n的階乘(不考慮溢位的問題)

//遞迴

intfactorial

(int n)

return n*

factorial

(n-1);

}int

main()

非遞迴

int

factorial

(int n)

return result;

}int

main()

3.strlen的模擬(遞迴實現) 遞迴和非遞迴分別實現strlen

非遞迴的方法

int

my_strlen

(char

* str)

return count;

}int

main()

讓我們來看看遞迴做法

int

my_strlen

(char

* str)

intmain()

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

實現:將引數字串中的字元反向排列。要求:不能使用c函式庫中的字串操作函式

思路非遞迴 1.給兩個指標,left放在字串左側,right放在最後乙個有效字元位置

2. 交換兩個指標位置上的字元

3. left指標往後走,right指標往前走,只要兩個指標沒有相遇,繼續2,兩個指標相遇後,逆置結束

char

reverse_string

(char string)

return

*string;

}int

main()

再看看遞迴做法有何不同

void

reverse_string

(char arr)

*(arr + len -1)

= tmp;

//f返回時 把每一趟tmp存的值賦給字串最後乙個元素

}int

main()

5.計算乙個數的每位之和(遞迴實現) 寫乙個遞迴函式digitsum(n),輸入乙個非負整數,返回組成它的數字之和例如,呼叫digitsum(1729),則應該返回1+7+2+9,它的和是19輸入:1729,輸出:19

思路//1729->dig(172)->dig(17)->dig(1)=1 返回1+7+2+9

// +9 +2 +7

int

digitsum

(int num)

return num %10+

digitsum

(num /10)

;}intmain()

6.編寫乙個函式實現n的k次方,使用遞迴實現

//遞迴 5!->5*4!->4*3!->3*2!->2*1!

intfactorial

(int n)

return n*

factorial

(n-1);

}int

main()

再來看一看非遞迴是怎麼實現的

//非遞迴

intfactorial

(int n)

return result;

}int

main()

7.遞迴和非遞迴分別實現求第n個斐波那契數 見例子

遞迴函式小練習

define crt secure no warnings 1 includeint fibonacci1 int n else int fibonacci int n else return a3 int main define crt secure no warnings 1 includein...

函式遞迴 遞推與回溯 練習題

遞迴與二分法習題 二分法就是在按照從大到小或者從小到大規律排布的列表中,尋找的值通過與中間的值比較大小,從而對列表進行操作,然後再比較的迴圈過程。用遞迴的方法找出列表中的值 num 1,3,4,5,6,8,22,33,55,778,990 def search search number,num i...

遞推遞迴練習 C 遞迴的函式

給定乙個函式 f a,b,c 如果 a 0 或 b 0 或 c 0 返回值為 1 如果 a 20 或 b 20 或 c 20 返回值為 f 20,20,20 如果 a b 並且 b c 返回 f a,b,c 1 f a,b 1,c 1 f a,b 1,c 其它情況返回 f a 1,b,c f a 1...