问题描述:
熊孩子Davis家有一个楼梯,这个楼梯总有n级台阶,Davis每次只能爬1、2或者3阶,他有几种不同的爬法?
Sample:
***** Input:
***** 3
***** Output:
***** 4
***** Input:
***** 7
***** Output:
***** 44
我们可以这样思考这个问题:假如有n阶,那么最后一步爬到n阶的方法有:从n-1阶爬1阶,从n-2阶爬2阶,从n-3阶爬3阶,则可将其演化公式 step(n) = step(n-1) + step(n-2) + step(n-3)
直接使用斐波那契数列来解决:
- (NSInteger)stepPermsWithStaircaseNumbers(NSInteger)staircaseNumbers{
if (staircaseNumbers == 1) {
return 1;
} else if(staircaseNumbers == 2) {
return 2;
} else if (staircaseNumbers == 3) {
return 4;
} else {
return [self stepPermsWithStaircaseNumbers:staircaseNumbers-1] + [self
stepPermsWithStaircaseNumbers:staircaseNumbers-2] + [self
stepPermsWithStaircaseNumbers:staircaseNumbers-3];
}
}
在用斐波那契数列时,如果当n变大时(比如输入50,将会很久才能得到结果,甚至程序崩溃),计算效率会非常低。
优化方案:在斐波那契数列算法中,其实有大量的计算是重复的,导致程序会非常慢,我们要做的就是记录下这些数值,从小往大算,每个只计算一次。
- (NSInteger)optimizationStepPermsWithStaircaseNumbers:(NSInteger)staircaseNumbers {
if (staircaseNumbers == 1) {
return 1;
} else if (staircaseNumbers == 2) {
return 2;
} else if (staircaseNumbers == 3) {
return 4;
} else {
NSInteger value = 0;
NSInteger value1 = 1;
NSInteger value2 = 2;
NSInteger value3 = 4;
for (NSInteger i = staircaseNumbers - 3; i <= staircaseNumbers; i++) {
value = value1 + value2 + value3;
value1 = value2;
value2 = value3;
value3 = value;
}
return value;
}
}