汉诺塔问题(认真分析版)

文章通过一个汉诺塔问题实例,详细分析了自顶向下的编程思路,递归与分治策略,以及在代码中如何处理形参与实参。同时,探讨了递归函数的时间复杂度为2^n和空间复杂度为O(n),并强调了有意义的标识符和代码可读性的重要性。
摘要由CSDN通过智能技术生成

将从8大角度分析:

自顶向下,逐渐求精,函数调用
递归与分治(基础与归纳)
不要跨层分析
形参与实参(代码跟踪)
有意义、规范的标识符
时间复杂度
递归栈(代码跟踪)
空间复杂度

先上代码,再写废话

#include <stdio.h>

/**
 * Hanoi.
 */
void hanoi(int paraN, char paraSource, char paraDestination, char paraTransit) {
	printf("%d plates.The address is %d %d %d %d .\r\n", paraN, &paraN, &paraSource, &paraDestination, &paraTransit);
	if (paraN <= 0) {
		return;
	}
	else {
		hanoi(paraN - 1, paraSource, paraTransit, paraDestination);
		printf("%c -> %c \r\n", paraSource, paraDestination);
		hanoi(paraN - 1, paraTransit, paraDestination, paraSource);
	}// Of if
}// Of hanoi

/**
 * Test the hanoi function.
 */
void hanoiTest() {
	printf("---- addToTest begins. ----\r\n");

	printf("2 plates\r\n");
	hanoi(2, 'A', 'B', 'C');

	printf("3 plates\r\n");
	hanoi(3, 'A', 'B', 'C');

	printf("---- addToTest ends. ----\r\n");
}// Of addToTest

/**
 The entrance.
 */
void main() {
	hanoiTest();
}// Of main

运行结果

 一、自顶向下,逐渐求精,函数调用

自顶向下:即为针对问题先设计一个初步框架,写一些实现功能的伪代码,在逐步细化、精细各个功能,从上往下逐步精细、细化代码,精益求精。

二、递归与分治(基础与归纳)

分治:将大问题分为几个小问题,在分别治理

递归:将大问题分为几个相同的问题,再治理

三、不要跨层分析

以汉诺塔问题为例,当我们分析N个板砖时,将自上而下的N-1个板砖看成一个整体,仅分析第N-1个和第N个,此时不用管N-1个板砖内部是怎样移动的

四、形参与实参(代码跟踪)

形参:我理解的是,写一个函数的时候,总得要给函数一个/多个参数名,这个就是形参,并且形参只存在于函数内部,在函数内部实现完功能后,即刻被清理

实参:我理解的是,传入函数的参数,存在于主函数,在实现完函数功能后不会被清理释放

五、有意义、规范的标识符

有意义、规范的标识符主要是规范代码书写,提高代码的可读性,在后期debug的时候,便于快速熟悉代码

六、时间复杂度

汉诺塔的时间复杂度为T(2^n)

上篇文章已经阐述过,此处不再赘述

主要求解方法,利用递推公式

{

T(n) = 2*T(n-1) + 1

T(1) = 1

}

公式不再细述

七、递归栈(代码跟踪)

自上而下的跟踪代码,便可画出树状图,根据树状图逐步分析,即可知道栈空间中h(1)、h(2)、h(3)的弹入弹出情况

八、空间复杂度

由第七点画出栈空间的使用情况后,易知汉诺塔问题的空间复杂度为O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值