函数体内又去调用自己,(自身调用自身). 这样的函数称为递归函数
写递归函数时,避免死递归
=> 一定要有结束递归的条件
=> return
=> 怎写结束递归的条件
=> 递归层层调用后,按原路层层返回
function fn(n){ // 3, 2 ,1
if(n == 1){
return
}
console.log('fn >>>')
n-- // 2, 1
fn(n)
}
fn(3)
示例
<!--
求 1 至 5 的和 1+2+3+4+5 = ?
累加算法
var s = 0 //累加和
for(var i = 1; i<=5 ; i++){
s = s + i
}
递归法
function sum(n){
if(n == 1){
return 1
}
return sum(n-1) + n
}
sum(3)
-->
// 1 + 2 + 3
function sum(n) {
if (n == 1) {
return 1
}
return sum(n - 1) + n
}
var s = sum(3)
console.log('和是 ',s);
练习
1. 求 1 至 5 的和 1+2+3+4+5 = ?
2. 求 1 至 5 的乘积 1*2*3*4*5 = ?
3. 入职薪水10K,每年涨幅5%,50年后工资多少?
1. 求 1 至 5 的和 1+2+3+4+5 = ?
递归分析:
1. 函数自身调用自身
2. 一定要有结束递归语句
3. 递归思路:
获取某个值,先确定前一个值,至到前一个值可以直接返回为止
sum(3)
sum(2)
sum(1)
1
1 + 2 + 3 + 4 + 5
sum(5)
=> sum(4) + 5
=> sum(3) + 4
=> sum(2) + 3
=>sum(1) + 2
=> 1
- 递归结束条件
- 前一个递归函数和后一个递归函数之间关系
sum(n) = sum(n-1) + n
2. 求 1 至 5 的乘积 1 * 2 * 3 * 4 * 5 = ?
分析: fn(5)
fn(4) * 5
fn(3) * 4
fn(2) * 3
fn(1) * 2
1
fn(n) = fn(n-1) * n
*/
// function fn(n) {
// if (n == 1) {
// return 1
// }
// return fn(n - 1) * n
// }
// fn(5)
3. 入职薪水10K,每年涨幅5%,5年后工资多少?
分析:
getSalary(5)
getSalary(4) + getSalary(4) * 0.05
getSalary(n)
getSalary(n - 1) + getSalary(n - 1) * 0.05
getSalary(1)
10000*12
*/
function getSalary(year) {
if (year == 1) {
return 10000 * 12
}
return getSalary(year - 1) + getSalary(year - 1) * 0.05
}
getSalary(2)