变态跳台阶
变态跳台阶
http://www.nowcoder.com/questionTerminal/22243d016f6b47f2a6928b4313c85387
先来捋一下规律:
1层 1种情况-->F(1)=1
2层 两种情况 1.从一层跳上来 2.直接跳两层-->F(2)=F(1)+1
3层 三种情况 1.从一层跳上来 2.二层跳上来 3.直接跳三层-->F(3)=F(1)+F(2)+1
4层 四种情况 1.从一层跳上来 2.二层跳上来 3.三层跳上来 4.直接跳四层-->F(4)=F(1)+F(2)+F(3)+1
可以看出来规律其实很简单,一个n层台阶的跳法有F(1)+F(2)+...+F(n-1)+1种
第一种解法,用一个数组存放所有台阶的跳法:
function jumpFloorII(number) { if(number===1) return 1; if(number===2) return 2; let arr = [1,2]; for (let i=2;i<number;i++){ arr.push(arr.reduce(function (sum,num) { return sum + num; })+1); } return arr.pop(); }
然后再回过头看看之前总结的规律,可以发现一个有意思的事情:
1层 F(1)=1
2层 F(2)=F(1)+1=F(1)+F(1)=2F(1)
3层 F(3)=F(1)+F(2)+1=F(2)+(F(1)+1)+F(2)+F(2)=2F(2)
4层 F(4)=F(1)+F(2)+F(3)+1=3*F(3)
因此也可以用递归解法:
function jumpFloorII(number) { // write code here if (number===1) return 1; return 2*jumpFloorII(number-1); }