目录
例 3-9 用递归法计算从 n 个人中选选 k 个人组成一个委员会的不同组合数。
函数的嵌套调用
嵌套调用
例3-7 输入两个整数,求平方和
#include <iostream>
using namespace std;
int fun2(int m) {
return m * m;
}
int fun1(int x,int y) {
return fun2(x) + fun2(y);
}
int main() {
int a, b;
cout<<"Please enter two integers (a and b): ";
cin >> a >> b;
cout << "The sum of square of a and b: "
<< fun1(a, b) << endl;
return 0;
}
函数的递归调用
定义
l 函数直接或间接地调用自身,称为递归调用。
例:计算n!
l 公式1:n!=n×(n-1)×(n-2)×(n-3)×...×2×1.
l 公式2:
例如,计算4!的两个阶段:
l 递推:
l 回归:
例3-8 求n!
源代码:
#include <iostream>
using namespace std;
unsigned fac(int n){
unsigned f;
if (n == 0)
f = 1;
else
f = fac(n - 1) * n;
return f;
}
int main() {
unsigned n;
cout << "Enter a positive integer:";
cin >> n;
unsigned y = fac(n);
cout << n << "! = " << y << endl;
return 0;
}
运行结果:
Enter a positive integer:8
8! = 40320
例 3-9 用递归法计算从 n 个人中选选 k 个人组成一个委员会的不同组合数。
分析
由 n 个人里选 k 个人的组合数= 由 n-1 个人里选 k 个人的组合数+由 n-1 个人里 选 k-1 个人的组合数;
当 n = k 或 k = 0 时,组合数为 1。
源代码:
#include<iostream>
using namespace std;
int comm(int n, int k)
{
if (k > n) return 0;
else if (n == k || k == 0)
return 1;
else return comm(n - 1, k) + comm(n - 1, k - 1);
}
int main()
{
int n, k;
cin >> n >> k;
cout << "C(n, k) = " << comm(n, k) << endl;
return 0;
}
运行结果:
18 5
8568
例3-10汉诺塔
l 有三根针A、B、C。A针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。
l 将n 个盘子从A针移到C针可以分解为三个步骤:
n 将A 上n-1个盘子移到 B针上(借助C针);
n 把A针上剩下的一个盘子移到C针上;
n 将n-1个盘子从B针移到C针上(借助A针)。
源代码:
#include <iostream>
using namespace std;
//将src针的最上面一个盘子移动到dest针上
void move(char src, char dest) {
cout << src << " --> " << dest << endl;
}
//将n个盘子从src针移动到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);
}
}
int main() {
int m;
cout << "Enter the number of diskes: ";
cin >> m;
cout << "the steps to moving " << m << " diskes:" << endl;
hanoi(m, 'A', 'B', 'C');
return 0;
}
运行结果:
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
函数的参数传递
- 在函数被调用时才分配形参的存储单元
- 实参可以是常量、变量或表达式
- 实参类型必须与形参相符
- 值传递是传递参数值,即单向传递
- 引用传递可以实现双向传递
- 常引用作参数可以保障实参数据的安全