概念
如果一个函数在内部调用这个函数自身,这个函数就是递归函数。
递归在数据结构和算法中经常用到,可以将很多复杂的数据模型拆解为简单问题进行求解。一定要掌握。
递归的要素
-
递归体:把大问题拆解为小问题进行分析。
-
边界条件:需要确定递归到何时结束。
递归案例:
一、计算阶乘
<script>
// 封装一个计算阶乘的函数,接受一个需要计算阶乘的数字参数
function factorial(n) {
if (n > 0) {
//递归结束的条件
if (n === 1) return 1
return n * factorial(n - 1)//继续往下递归,直到n的值为1时
}
}
const result = factorial(3)
console.log(result)
</script>
二、寻找所有的喇叭花数
题目:喇叭花数是一个三位数,其每一位数字的阶乘之和恰好等于它本身,即abc=a! + b! + c!
,其中abc表示一个三位数。请找出所有的喇叭花数。
思路:将计算某个数字的阶乘封装成函数。
<script>
//穷举法,从100到999遍历
for (let i = 100; i <= 999; i++) {
//将数字i转化成字符串
const i_str = i.toString();
//分别获取百位,十位,个位并利用+进行隐式转换成数字类型,
const a = Number(i_str[0])
const b = Number(i_str[1])
const c = Number(i_str[2])
//根据喇叭花数的条件进行判断
if (factorial1(a) + factorial1(b) + factorial1(c) === i)
console.log(i);
}
// 封装一个计算阶乘的函数,接受一个需要计算阶乘的数字参数
function factorial1(n) {
if (n > 0) {
//递归结束的条件
if (n === 1) return 1
return n * factorial1(n - 1)//继续往下递归,直到n的值为1时
}
}
</script>
三、斐波那契数列
斐波那契数列是这样一个数列:1、1、2、3、5、8、13、21、34......最早是由意大利数学家斐波那契开始研究的。它的规律是:下标为0和1的项,值为1;从下标为2的项开始,每一项等于前面两项之和。
提问:请找出斐波那契数列的前10项。
<script>
//递归函数:返回斐波那契数列中下标为n的那一项的值
function fn(n) {
//递归结束条件,下标为0和1的项,值为1
if (n === 0 || n === 1) return 1
// 继续往下递归,从下标为2的项开始,每一项等于前面两项之和
return fn(n - 1) + fn(n - 2)
}
// 循环语句:打印斐波那契数列的前10项
for (let i = 0; i <= 10; i++) {
console.log(fn(i));
}
</script>