递归思想学习归纳
要使用递归首先得满足两个条件:
所要解决的问题是由多个相同的步骤重复即可解决的(相同规律)
有结束的明显点
范例
- 求和 1-100 的和
分析
重复第一项和第二项相加到最后一项n
到n为一的时候结束
function sum(n) {
if (n == 1) return 1
return sum(n - 1) + n
}
可以尝试较小的n测试自己的递推式是否正确,可以反向用n+1实现
2.斐波拉契数列 0,1,2,3,5,8,13,21,34,55,89…求第 n 项
分析
第一项和第二项得到第三项 每一项都是重复此规律
n为一或n为2的时候的时候结束,1、2单独分析
function fib(n) {
if (n === 1 || n === 2) return n - 1
return fib(n - 1) + fib(n - 2)
}
- 爬楼梯(这个最明显)
假如楼梯有 n 个台阶,每次可以走 1 个或 2 个台阶,请问走完这 n 个台阶有几种走法
function climbStairs(n) {
if (n == 1) return 1
if (n == 2) return 2
return climbStairs(n - 1) + climbStairs(n - 2)
}
分析
****自己思考哟我就是看见这块有理解的,不懂可以留言
4.数组反转问题
正常解决思路:
两个指针首位调换
递归思路:
重复调换动作
找到停止调换的标志位
var fruits = ["Banana", "Orange", "Apple", "Mango"];
function myFunction(){
this.revers(fruits);
var x=document.getElementById("demo");
x.innerHTML=fruits;
}
function revers(tem){
let start = 0;
let end = tem.length-1;
this.repeat(start ,end)
}
function repeat(start ,end){
let temParm = "";
temParm = fruits[start];
fruits[start] = fruits[end];
fruits[end] = temParm;
start++;
end--;
if(end <= start){
return;
}
return repeat(start ,end)
}