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

简介: 原文: 一步一步写算法(之爬楼梯) 【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】     前两天上网的时候看到一个特别有意思的题目,在这里和朋友们分享一下:     有一个人准备开始爬楼梯,假设楼梯有n个,这个人只允许一次爬一个楼梯或者一次爬两个楼梯,请问有多少种爬法?     在揭晓答案之前,朋友们可以自己先考虑一下:     这个人爬n层楼梯,那么它也不是一下子就可以爬这么高的,他只有两个选择,要么从n-2层爬过来,要么从n-1层爬过来。
原文: 一步一步写算法(之爬楼梯)

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



目录
相关文章
|
存储 算法 Java
算法学习入门Day1_Leetcode_70 爬楼梯 ~还是辣么滴丝滑 雀氏润
算法学习入门Day1_Leetcode_70 爬楼梯 ~还是辣么滴丝滑 雀氏润
算法学习入门Day1_Leetcode_70 爬楼梯 ~还是辣么滴丝滑 雀氏润
|
算法 JavaScript 前端开发
图解算法 | LeetCode第 70 题爬楼梯问题
图解算法 | LeetCode第 70 题爬楼梯问题
160 0
|
算法
leetcode算法70.爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?本文带大家解决这个问题。
131 0
leetcode算法70.爬楼梯
☆打卡算法☆LeetCode 70、爬楼梯 算法解析
“假设你在爬楼梯,需要n阶到达楼顶,每次可以怕1到2阶,有多少种方法爬到楼顶呢。”
|
算法
算法题每日一练---第38天:爬楼梯的最少成本
请找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。
154 0
算法题每日一练---第38天:爬楼梯的最少成本
|
算法 Java C#
【小Y学算法】⚡️每日LeetCode打卡⚡️——22.爬楼梯
📢前言 🌲原题样例 🌻C#方法:动态规划 🌻Java 方法一:动态规划 🌻Java 方法二:矩阵快速幂 💬总结 🚀往期优质文章分享
【小Y学算法】⚡️每日LeetCode打卡⚡️——22.爬楼梯
|
算法
算法-爬楼梯
如果爬楼梯可以一次爬 1 级或是一次爬 2 级 输入:楼梯的总级数 输出:一共可能有多少种爬法? 难度:简单 例: 输入:2 输出:2 ① 1 + 1 ② 2 输入:3 输...
1474 0
|
2天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
103 80
|
21天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。