函式遞迴
遞迴的兩個條件:
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...