Appearance
简介
你去找银行经理办事。
- 经理 A:不关我的事,找经理 B。
- 经理 B:不关我的事,找经理 A。
你在两个经理之间往返了一整天。在程序中,该行为称作「递归」。
直接递归
函数 f()
在内部调用了自己。
cpp
void f() {
/* Do something */
f();
}
这和以下死循环等价。
cpp
while (true) {
/* Do something */
}
间接递归
这类似于两个银行经理的情况。
cpp
void A() {
B();
}
void B() {
A();
}
边界条件
合法的递归需要边界条件,使函数在恰当的时机停止。
cpp
void f() {
if (.../* 边界条件 */)
return;
/* Do something */
f();
}
这和以下循环等价。
cpp
while (.../* 边界条件 */) {
/* Do something */
}
例 1
计算阶乘
cpp
int f(int n) {
if (n == 0)
return 1;
return f(n - 1) * n;
}
运行 f(3)
:
- A:来人,计算
。 - B:来人,计算
。 - C:来人,计算
。 - D:来人,计算
。 - E:报告,
。
- E:报告,
- D:报告,
。
- D:来人,计算
- C:报告,
。
- C:来人,计算
- B:报告,
。
- B:来人,计算
- A:报告,
。
例 2
计算斐波那契数列的第
cpp
int f(int n) {
if (n == 1 || n == 2)
return 1;
return f(n - 1) + f(n - 2);
}