【文章內(nèi)容簡(jiǎn)介】
return 0。 } 運(yùn)行結(jié)果: Please enter two integers(a and b): 3 4 The sum of square of a and b: 25 29 C++語(yǔ)言程序設(shè)計(jì) 清華大學(xué) 鄭莉 30 遞歸調(diào)用 ?函數(shù)直接或間接地調(diào)用自身,稱為遞歸調(diào)用。 ?遞歸過(guò)程的兩個(gè)階段: – 遞推: 4!=4 3!→ 3!=3 2!→ 2!=2 1!→ 1!=1 0!→ 0!=1 未知 已知 – 回歸: 4!=4 3!=24← 3!=3 2!=6← 2!=2 1!=2← 1!=1 0!=1← 0!=1 未知 已知 函數(shù)的聲明與使用 C++語(yǔ)言程序設(shè)計(jì) 清華大學(xué) 鄭莉 31 例 38 求 n! 分析:計(jì)算 n!的公式如下: 這是一個(gè)遞歸形式的公式,應(yīng)該用遞歸函數(shù)實(shí)現(xiàn)。 函數(shù)的聲明與使用 ???????)0()!1()0(1!nnnnn源程序: include iostream using namespace std。 unsigned fac(int n){ unsigned f。 if (n == 0) f = 1。 else f = fac(n 1) * n。 return f。 } 32 int main() { unsigned n。 cout Enter a positive integer:。 cin n。 unsigned y = fac(n)。 cout n ! = y endl。 return 0。 } 運(yùn)行結(jié)果: Enter a positive integer:8 8! = 40320 33 C++語(yǔ)言程序設(shè)計(jì) 清華大學(xué) 鄭莉 34 例 39 ? 用遞歸法計(jì)算從 n個(gè)人中選擇 k個(gè)人組成一個(gè)委員會(huì)的不同組合數(shù)。 ? 分析: 由 n個(gè)人里選 k個(gè)人的組合數(shù) = 由 n1個(gè)人里選 k個(gè)人的組合數(shù) +由 n1個(gè)人里選 k1個(gè)人的組合數(shù) 當(dāng) n = k或 k = 0時(shí),組合數(shù)為 1 函數(shù)的聲明與使用 include iostream using namespace std。 int m(int n, int k) { if (k n) return 0。 else if (n == k || k == 0) return 1。 else return m(n 1, k) + m(n 1, k 1)。 } int main() { int m(int n, int k)。 int n, k。 cout Please enter two integers n and k: 。 cin n k。 cout C(n, k) = m(n, k) endl。 return 0。 } 運(yùn)行結(jié)果: 18 5 8568 35 C++語(yǔ)言程序設(shè)計(jì) 清華大學(xué) 鄭莉 36 例 310漢諾塔問(wèn)題 有三根針 A、 B、 C。 A針上有 N個(gè)盤(pán)子,大的在下,小的在上,要求把這 N個(gè)盤(pán)子從 A針移到 C針,在移動(dòng)過(guò)程中可以借助 B針,每次只允許移動(dòng)一個(gè)盤(pán),且在移動(dòng)過(guò)程中在三根針上都保持大盤(pán)在下,小盤(pán)在上。 函數(shù)的聲明與使用 A B C 分析: 將 n 個(gè)盤(pán)子從 A針移到 C針可以分解為下面三個(gè)步驟: ①將 A 上 n1個(gè)盤(pán)子移到 B針上(借助 C針) 。 ② 把 A針上剩下的一個(gè)盤(pán)子移到 C針上 。 ③ 將 n1個(gè)盤(pán)子從 B針移到 C針上(借助 A針) 。 事實(shí)上,上面三個(gè)步驟包含兩種操作: ①將多個(gè)盤(pán)子從一個(gè)針移到另一個(gè)針上,這是一個(gè)遞歸的過(guò)程。 hanoi函數(shù)實(shí)現(xiàn)。 ②將 1個(gè)盤(pán)子從一個(gè)針上移到另一針上。 用 move函數(shù)實(shí)現(xiàn)。 37 include iostream using namespace std。 //把 src針的最上面一個(gè)盤(pán)子移動(dòng)到 dest針上 void move(char src, char dest) { cout src dest endl。 } //把 n個(gè)盤(pán)子從 src針移動(dòng)到 dest針,以 medium針作為中介 void hanoi(int n, char src, char medium, char dest) { if (n == 1) move(src, dest)。 else { hanoi(n 1, src, dest, medium)。 move(src, dest)。 hanoi(n 1, medium, src, dest)。 } } 38 int main() { int m。 cout Enter the number of diskes: 。 cin m。 cout the steps to moving m diskes: endl。 hanoi(m,39。A39。,39。B39。,39。C39。)。 return 0。 } 39 運(yùn)行結(jié)果: Enter the number of diskes:3 the steps to moving 3 diskes: A C A B C B A C B A B C A C 40 C++語(yǔ)言程序設(shè)計(jì) 清華大學(xué) 鄭莉 41 函數(shù)的參數(shù)傳遞機(jī)制 —— 傳遞參數(shù)值 ? 在函數(shù)被調(diào)用時(shí)才分配形參的存儲(chǔ)單元。 ? 實(shí)參可以是常量、變量或表達(dá)式。 ? 實(shí)參類型必須與形參相符。 ? 傳遞時(shí)是傳遞參數(shù)值,即單向傳遞。 函數(shù)的聲明與使用 C++語(yǔ)言程序設(shè)計(jì) 清華大學(xué) 鄭莉 42 函數(shù)的參數(shù)傳遞機(jī)制 —— 參數(shù)值傳遞舉例 X N 被調(diào)函數(shù): 主調(diào)函數(shù): 3 A D = power(A,3) 3 double power(double X,int N) 函數(shù)的聲明與使用 C++語(yǔ)言程序設(shè)計(jì) 清華大學(xué) 鄭莉 43 例 311 輸入兩個(gè)整數(shù)交換后輸出 includeiostream using namespace std。 void swap(int a, int b) { int t = a。 a = b。 b = t。 } 函數(shù)的聲明與使用 int main() { int x = 5, y = 10。 cout x = x y = y endl。 swap(x, y)。 cout x = x y = y endl。 return 0。 } 運(yùn)行結(jié)果 : x = 5 y = 10 x = 5 y = 10 44 a=b。 5 x 10 y 5 a 10 b