问题概述:有一只青蛙,每次可以跳1阶台阶,也可以跳2阶台阶,现在有n阶台阶,问该只青蛙一共有多少种算法?
整体解题思路:青蛙跳台阶的问题其实非常相似斐波那契数列的问题
通过测试,我们可以发现规律
从台阶数量为3开始,每次的总次数都是前两次的次数之和
所以同样的,我们可以用类似斐波那契的数列方式进行求解
递归算法(C语言/vs2019)
思路:(假设我们实参传递给形参的step_n值是4)
1:step_n第一次是4,if分支语句判断,前两者都不满足(即表达式都为假),执行else所控制的语句,得到return frogJumpStep(4-1) + frogJumpStep(4-2)
2:我们先执行frogJumpStep(4-2),递归调用frogJumpStep函数,这次传递的step_n是2,if分支语句判断, 第一个不满足,第二个满足, return 2;那么返回原来的函数,如下所示
3:现在执行frogJumpStep(4-1), 递归调用frogJumpStep函数,这次传递的step_n是3,if分支语句判断,前两者都不满足(即表达式都为假),执行else所控制的语句,得到return frogJumpStep(3-1) + frogJumpStep(3-2)
4:这个时候,就相当于大问题,变成了小问题,然后从step_n = 3开始的这个新的递归函数frogJumpStep(3-1) 和 frogJumpStep(3-2)入手,通过同样的方式调用发现,分别返回2和1
5:最后,step_n等于3返回最终结果等于3,step_n等于4得到最终结果5
6:最后,整体流程如下
非递归算法(C语言/vs2019)
思路:(假设我们实参传递给形参的step_n值是4)
1:非递归算法的整体解题思路跟递归相似,主要是应用了循环中判断部分,已经循环体达到运算的部分。
2:从step_n等于4,进入循环,满足判断表达式部分,循环变量I < 4, 执行循环体,先让
result = stc1 + stc2 等价于 result = 1 + 2; 然后stc1 = stc2,等价于这个时候 stc1变量中保存了stc2的值,stc1 = 2; 而stc2则保存了result的值,stc2 = 3;
3:i++,等到i等于3, 3 < 4; 满足,继续执行循环体,result = stc1 + stc2, 因为stc1和stc2的值已经被改变,所以 等价于 result = 2 + 3; 然后stc1 = stc2,等价于这个时候 stc1变量中保存了stc2的值,stc1 = 3; 而stc2则保存了result的值,stc2 = 5;
4:i++, i等于4, 4 < 4; 不满足 结束循环,返回result值。