`
java-mans
  • 浏览: 11710660 次
文章分类
社区版块
存档分类
最新评论

一步一步写算法(之爬楼梯)

 
阅读更多

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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的时候应该怎么运行,同时手算和程序相结合,不断修正代码,完善代码。



分享到:
评论

相关推荐

    Python3爬楼梯算法示例

    本文实例讲述了Python3爬楼梯算法。分享给大家供大家参考,具体如下: 假设你正在爬楼梯。需要 n 步你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数...

    c语言爬楼梯回溯算法

    在这个爬楼梯问题中,因为每一步只有两种选择(1步或2步),所以解空间相对较小,算法效率较高。然而,在更复杂的问题中,如全排列或N皇后问题,回溯算法可能会导致大量的重复计算,此时需要结合剪枝技术来优化。 ...

    爬楼梯 java版程序源码

    //如果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 //每行第一个元素...

    js代码-(算法)(动态规划)爬楼梯

    在这个问题中,爬楼梯代表了一个逐步解决的过程,每一步都有一定的选择,而动态规划可以帮助我们找到最优的选择路径。 【标签解析】 "代码"标签表明这个问题的解决方案是通过编写程序代码实现的,特别是JavaScript...

    蓝桥杯国赛题之Python爬楼梯.zip

    【标题】"蓝桥杯国赛题之Python爬楼梯.zip" 涉及的知识点主要集中在编程语言Python和算法的应用上,尤其是与蓝桥杯竞赛相关的编程挑战。蓝桥杯是一项国内知名的编程竞赛,旨在检验参赛者的编程技能和算法理解能力。...

    labuladong的算法小抄.pdf

    4. 爬楼梯问题:通过状态转移方程找到到达顶部的最少步数。 六、其他算法 1. 哈希表:快速查找和存储数据,常用于实现字典或查找表。 2. 字符串匹配:如KMP算法,避免不必要的回溯,提高匹配效率。 3. 回溯法:在...

    javascript-leetcode面试题解动态规划问题之第70题爬楼梯-题解.zip

    对于更一般的情况,第i级楼梯的方法数等于前一级(i-1)和前两级(i-2)楼梯的方法数之和,因为到达第i级楼梯的方式只能是从第i-1级走一步或者从第i-2级走两步过来。所以状态转移方程可以表示为:dp[i] = dp[i-1] + ...

    c语言基础-c语言编程基础之动态规划示例-爬楼梯.zip

    在这个“c语言基础_c语言编程基础之动态规划示例_爬楼梯”的主题中,我们将深入探讨如何利用C语言实现动态规划方法,通过爬楼梯问题来讲解这一概念。 首先,让我们理解一下爬楼梯问题。假设有一座有n级台阶的楼梯,...

    信息学奥赛一本通-教程PPT课件(第五版)算法部分 第三章 递推算法.pdf

    2. 楼梯走法问题(stairs) 该问题是一个经典的递推问题,可以用递归函数来解决。在这个问题中,每一步有两种走法:一是走一阶,二是走两阶。要求编写递归程序计算走完N级台阶有多少种不同的走法。这个问题的递推...

    易语言阶梯优化算法

    这种算法的核心思想是通过逐步调整解决方案,每次优化一小步,逐渐接近最优解,如同爬楼梯般逐级提升。在这个过程中,算法会不断评估当前状态并寻找下一个更优的步骤,直到达到预定的目标或满足停止条件。 阶梯优化...

    阶梯 问题

    某人上楼梯,他一步可以迈一个台阶,两个台阶或三个台阶,共有n个台阶,编程输出他所有可能上法。如:有4个台阶,输出应是: 1 1 1 1 1 1 2 1 2 1 1 3 2 1 1 2 2 3 1 算法设计: 给定台阶的个数n,输出所有可能的上法...

    Python使用回溯法子集树模板解决爬楼梯问题示例

    爬楼梯问题是一个典型的动态规划问题,也可以通过回溯法解决。问题描述是:有一座楼梯,有n级台阶,每次可以迈1级或2级台阶,求从地面到达楼梯顶部有多少种不同的走法。 在使用回溯法解决这个问题时,我们首先定义...

    js代码-算法-动态规划-爬楼梯

    在编程领域,动态规划是一种强大的算法,常用于解决复杂的问题,比如我们的主题“爬楼梯”。这个主题实际上是一个经典的计算机科学问题,它可以帮助我们理解动态规划的基本思想和应用。在这个问题中,我们假设有一座...

    C语言项目爬楼梯的两种实现方法参考

    总结来说,爬楼梯问题展示了递归和动态规划两种算法的使用。递归法简单直观,但效率较低,而动态规划法虽然实现稍微复杂,但能够显著提高运行效率。在实际编程中,需要根据问题规模和性能要求选择合适的解题策略。在...

    爬楼梯的最少成本java实现(csdn)————程序.pdf

    标题中的“爬楼梯的最少成本java实现”是一个经典的动态规划问题,它要求计算到达楼梯顶部的最低花费。在这个问题中,每个楼梯都有一个特定的代价,每次你可以选择爬1个或2个台阶,目标是找到从底部到顶部的最小代价...

    算法一纸开卷.docx

    爬楼梯问题通常与斐波那契数列相关,F(n)可通过F(n-1)和F(n-2)求得,体现了递归关系。 归并排序是另一种经典的分治算法,它通过递归地将数组分为两半,分别排序后合并,保证了排序的稳定性且时间复杂度为O(n log n)...

    js代码-爬楼梯台阶走法

    在编程领域,爬楼梯台阶走法是一个经典的动态规划问题,也被称为“斐波那契数列问题”的变种。在这个问题中,一个人要爬上n级台阶,每次可以跨1步或2步。任务是计算出有多少种不同的走法。这个问题在JavaScript中...

    数据结构与算法.xmind

    爬楼梯问题 找零问题 0-1背包问题 分治算法Divide and Conquer 应用:归并排序 其它 Rabin fingerprints 文件指纹算法 BitMap 位图算法 BloomFilter 布隆过滤器 线性表 栈 先进后出...

Global site tag (gtag.js) - Google Analytics