递归实现
public static long OneStepOrTwoStepSolution(int num) {
if(num == 1 || num ==2) {
return num;
}
return OneStepOrTwoStepSolution(num-1)+OneStepOrTwoStepSolution(num-2);
}
迭代实现
public static long OneStepOrTwoStepSolution1(int num) {
long one = 2;
long two = 1;
if(num == 1 || num ==2) {
return num;
long sum = 0L;
for(int i = 3 ; i <= num ;i++) {
sum = one + two;
two = one;
one = sum;
}
return sum;
}
测试
两种方式分别以n=5,n=50 测试,结果如下
-
n = 5:
递归–实现结果:8
递归–所用时间:<1 ms
迭代–实现结果:8
迭代–所用时间:<1 ms -
n=50
递归–实现结果:20365011074
递归–所用时间:38940 ms
迭代–实现结果:20365011074
迭代–所用时间:<1 ms
测试结果:随着n的不断增大,递归所用时间远超过迭代
总结:
- 递归:
- 优点:大问题转化为小问题,可以减少代码量,同时代码精简,可读性好;
- 缺点:递归调用浪费了空间,而且递归太深容易造成堆栈的溢出。
- 迭代
- 优点:代码运行效率好,因为时间只因循环次数增加而增加,而且没有额外的空间开销;
- 缺点:代码不如递归简洁,可读性好