mirror of
https://github.com/qianguyihao/Web.git
synced 2024-11-01 13:34:46 +08:00
96 lines
2.2 KiB
Markdown
96 lines
2.2 KiB
Markdown
|
## 递归函数
|
|||
|
|
|||
|
### 概念
|
|||
|
|
|||
|
如果一个函数在内部调用这个函数自身,这个函数就是递归函数。
|
|||
|
|
|||
|
递归在数据结构和算法中经常用到,可以将很多复杂的数据模型拆解为简单问题进行求解。一定要掌握。
|
|||
|
|
|||
|
### 递归的要素
|
|||
|
|
|||
|
- 递归模式:如何把大问题拆解为小问题进行分析。也称为递归体。
|
|||
|
- 边界条件:需要确定递归到何时终止。也称为递归出口。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
### 代码举例:计算阶乘
|
|||
|
|
|||
|
提问:求一个正整数的阶乘。
|
|||
|
|
|||
|
**普通写法:**
|
|||
|
|
|||
|
```js
|
|||
|
// 函数:计算一个正整数的阶乘
|
|||
|
function factorial(n) {
|
|||
|
let result = 1;
|
|||
|
for (let i = 1; i <= n; i++) {
|
|||
|
result *= i;
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
console.log(factorial(5)); // 120
|
|||
|
```
|
|||
|
|
|||
|
现在,我们学习了递归函数之后,会有更简洁的写法。
|
|||
|
|
|||
|
**递归写法:**
|
|||
|
|
|||
|
```js
|
|||
|
// 递归函数:计算一个正整数的阶乘
|
|||
|
function factorial(n) {
|
|||
|
// 递归出口:如果计算1的阶乘,就不用递归了
|
|||
|
if (n == 1) return 1;
|
|||
|
|
|||
|
// 开始递归:如果当前这个 n 不是1的阶乘,就返回 n * (n-1)!
|
|||
|
return n * factorial(n - 1);
|
|||
|
}
|
|||
|
console.log(factorial(5)); // 120
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## 递归函数的案例
|
|||
|
|
|||
|
### 寻找所有的喇叭花数
|
|||
|
|
|||
|
题目:喇叭花数是一个**三位数**,其每一位数字的阶乘之和恰好等于它本身,即`abc=a! + b! + c!`,其中abc表示一个三位数。请找出所有的喇叭花数。
|
|||
|
|
|||
|
思路:将计算某个数字的阶乘封装成函数。
|
|||
|
|
|||
|
代码实现:
|
|||
|
|
|||
|
```js
|
|||
|
// 递归函数:计算一个数的阶乘
|
|||
|
function factorial(n) {
|
|||
|
// 递归出口:如果计算1的阶乘,就不用递归了
|
|||
|
if (n == 1) return 1;
|
|||
|
|
|||
|
// 开始递归:如果当前这个 n 不是1的阶乘,就返回 n * (n-1)!
|
|||
|
return n * factorial(n - 1);
|
|||
|
}
|
|||
|
|
|||
|
// 穷举法,从100到999遍历,寻找喇叭花数
|
|||
|
for (let i = 100; i <= 999; i++) {
|
|||
|
// 将数字i转为字符串
|
|||
|
const i_str = i.toString();
|
|||
|
// abc分别表示百位、十位、个位
|
|||
|
const a = Number(i_str[0]);
|
|||
|
const b = Number(i_str[1]);
|
|||
|
const c = Number(i_str[2]);
|
|||
|
|
|||
|
// 根据喇叭花数的条件进行判断
|
|||
|
if (factorial(a) + factorial(b) + factorial(c) == i) {
|
|||
|
console.log(i);
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
打印结果:
|
|||
|
|
|||
|
```
|
|||
|
145
|
|||
|
```
|