资源描述:
《一步一步写算法(之爬楼梯)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一步一步写算法(之爬楼梯)【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing@163.com】 前两天上网的时候看到一个特别有意思的题目,在这里和朋友们分享一下: 有一个人准备开始爬楼梯,假设楼梯有n个,这个人只允许一次爬一个楼梯或者一次爬两个楼梯,请问有多少种爬法? 在揭晓答案之前,朋友们可以自己先考虑一下: 这个人爬n层楼梯,那么它也不是一下子就可以爬这么高的,他只有两个选择,要么从n-2层爬过来,要么从n-1层爬过来。除此之外,他没有别的选择。此时相信朋友其
2、实已经早看出来了,这就是一道基本的递归题目。 (1)首先我们建立一个函数,判断函数的合法性[cpp] viewplaincopy1.void jump_ladder(int layer, int* stack, int* top) 2.{ 3. if(layer <= 0) 4. return; 5. 6. return; 7.} (2)判断当前的层数是为1或者是否为2[cpp] viewplaincopy1.void jump_ladder(int laye
3、r, int* stack, int* top) 2.{ 3. if(layer <= 0) 4. return; 5. 6. if(layer == 1){ 7. printf_layer_one(layer, stack, top); 8. return; 9. } 10. 11. if(layer == 2){ 12. printf_layer_two(layer, stack, top);
4、13. return; 14. } 15. 16. return; 17.} (3)对于2中提及的打印函数进行设计,代码补全[cpp] viewplaincopy1.#define GENERAL_PRINT_MESSAGE(x) 2. do { 3. printf(#x); 4. for(index = (*top) - 1 ; index >= 0; index --) 5. printf("
5、%d", stack[index]); 6. printf(""); 7. }while(0) 8. 9.void printf_layer_one(int layer, int* stack, int* top) 10.{ 11. int index ; 12. GENERAL_PRINT_MESSAGE(1); 13.} 14. 15.void printf_layer_two(int layer, int* stack, int* top)
6、16.{ 17. int index; 18. 19. GENERAL_PRINT_MESSAGE(11); 20. GENERAL_PRINT_MESSAGE(2); 21.} 注:a)代码中我们使用了宏,注意这是一个do{}while(0)的结构,同时我们对x进行了字符串强转 b)当剩下台阶为2的时候,此时有两种情形,要么一次跳完;要么分两次 (4)当阶梯不为1或者2的时候,此时需要递归处理[cpp] viewplaincopy1.void _
7、jump_ladder(int layer, int* stack, int* top, int decrease) 2.{ 3. stack[(*top)++] = decrease; 4. jump_ladder(layer, stack, top); 5. stack[--(*top)] = 0; 6.} 7. 8.void jump_ladder(int layer, int* stack, int* top) 9.{ 10. if(layer <= 0)
8、 11. return; 12. 13. if(layer == 1){ 14. printf_layer_one(layer, stack, top); 15. return; 16. } 17. 1. if(layer == 2){ 2. printf_layer_two(layer, stack, top