【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前两天上网的时候看到一个特别有意思的题目,在这里和朋友们分享一下:
有一个人准备开始爬楼梯,假设楼梯有n个,这个人只允许一次爬一个楼梯或者一次爬两个楼梯,请问有多少种爬法?
在揭晓答案之前,朋友们可以自己先考虑一下:
这个人爬n层楼梯,那么它也不是一下子就可以爬这么高的,他只有两个选择,要么从n-2层爬过来,要么从n-1层爬过来。除此之外,他没有别的选择。此时相信朋友其实已经早看出来了,这就是一道基本的递归题目。
(1)首先我们建立一个函数,判断函数的合法性
void jump_ladder(int layer, int* stack, int* top)
{
if(layer <= 0)
return;
return;
}
(2)判断当前的层数是为1或者是否为2
void jump_ladder(int layer, int* stack, int* top)
{
if(layer <= 0)
return;
if(layer == 1){
printf_layer_one(layer, stack, top);
return;
}
if(layer == 2){
printf_layer_two(layer, stack, top);
return;
}
return;
}
(3)对于2中提及的打印函数进行设计,代码补全
#define GENERAL_PRINT_MESSAGE(x)\
do {\
printf(#x);\
for(index = (*top) - 1 ; index >= 0; index --)\
printf("%d", stack[index]);\
printf("\n");\
}while(0)
void printf_layer_one(int layer, int* stack, int* top)
{
int index ;
GENERAL_PRINT_MESSAGE(1);
}
void printf_layer_two(int layer, int* stack, int* top)
{
int index;
GENERAL_PRINT_MESSAGE(11);
GENERAL_PRINT_MESSAGE(2);
}
注: a)代码中我们使用了宏,注意这是一个do{}while(0)的结构,同时我们对x进行了字符串强转
b)当剩下台阶为2的时候,此时有两种情形,要么一次跳完;要么分两次
(4)当阶梯不为1或者2的时候,此时需要递归处理
void _jump_ladder(int layer, int* stack, int* top, int decrease)
{
stack[(*top)++] = decrease;
jump_ladder(layer, stack, top);
stack[--(*top)] = 0;
}
void jump_ladder(int layer, int* stack, int* top)
{
if(layer <= 0)
return;
if(layer == 1){
printf_layer_one(layer, stack, top);
return;
}
if(layer == 2){
printf_layer_two(layer, stack, top);
return;
}
_jump_ladder(layer- 1, stack, top, 1);
_jump_ladder(layer- 2, stack, top, 2);
}
祝:这里在函数的结尾添加了一个函数,主要是递归的时候需要向堆栈中保存一些数据,为了代码简练,我们重新定义了一个函数。
总结:
1)这道题目和斐波那契数列十分类似,是一道地地道道的递归题目
2)递归的函数也需要好好测试,使用不当,极容易堆栈溢出或者死循环。对此,我们可以按照参数从小到大的顺序依次测试,比如说,可以测试楼梯为1、2、3的时候应该怎么运行,同时手算和程序相结合,不断修正代码,完善代码。
分享到:
相关推荐
leetcode算法题爬楼梯,第一次提交,如有不足还请多多包涵!
一步一步写算法,一些好的算法。可以参考哈
主要介绍了Python3爬楼梯算法,涉及Python基于面向对象的字符串遍历、切片、运算等相关操作技巧,需要的朋友可以参考下
这是收集了较长时间的“一步一步写算法”相关资料,内容较全,分享给大家。
算法-爬楼梯(信息学奥赛一本通-T1204)(包含源程序).rar
//如果n的取值从32~36,m的取值从2~3,请写程序输出每种情况下小明有多少种爬楼梯的方法。 //输入格式:共2行数据,内容如下: //10 32 32 33 33 34 34 35 35 36 36 //10 2 3 2 3 2 3 2 3 2 3 //每行第一个元素...
php 算法 爬楼梯有多少种方法
详细讲述C语言的算法程序,是C编程基础入门之作,本文来自CSDN,只是整理好了供离线学习。在这里非常感谢费晓星老师的无私奉献,本文具有很高系统学习的价值。
这是我用c语言写的程序,我的其他资源都是免费的,是对于c语言初学者的帮助比较大的,其中有数据结构,window编程。我也在学c语言,每当我写完一个程序,我都会免费发上来。
html css js网页设计
js代码-算法-动态规划-爬楼梯
Des算法详细描述, 逐步指南,一步一步说明如何实现DES算法 ,中文翻译和英文原版
自己写的AES加密算法,输出每一步的结果
夜深人静写算法(四)算法设计与分析第四次作业涉及了多个重要主题,包括贪心算法、动态规划、图算法等。在贪心算法方面,我们学习了如何通过每一步的最优选择来得到整体的最优解,例如霍夫曼编码、最小生成树等问题...
算法-超级楼梯(HDU-2040)(包含源程序).rar