#include <stdio.h>
#include <stdlib.h>
//#include "stdafx.h"
void hanoi(int paraN, char paraSource, char paraDestination, char paraTransit){
if(paraN== 1){
printf("当前在执行 %c -%d-> %c 的全部转移,出发地址:%d,目标地址:%d, 过渡地址:%d \r\n\t 此时直接移动:%c -> %c \r\n", paraSource ,paraN ,paraDestination, ¶Source, ¶Destination, ¶Transit, paraSource, paraDestination);
}
else {
printf("当前在执行 %c -%d-> %c 的初始转移, 出发地址:%d,目标地址:%d, 过渡地址:%d \r\n", paraSource ,paraN ,paraDestination, ¶Source, ¶Destination, ¶Transit);
hanoi(paraN - 1, paraSource, paraTransit, paraDestination);
printf("当前在执行 %c -%d-> %c 的中间转移,没有调用hanoi函数 \r\n\t 此时直接移动:%c -> %c \r\n",paraSource ,paraN ,paraDestination, paraSource, paraDestination);
printf("当前在执行 %c -%d-> %c 的最终转移, 出发地址:%d,目标地址:%d, 过渡地址:%d \r\n", paraSource ,paraN ,paraDestination, ¶Source, ¶Destination, ¶Transit);
hanoi(paraN - 1, paraTransit, paraDestination, paraSource);
}// Of if
}// Of hanoi
/**
* Test the hanoi function.
*/
void hanoiTest() {
printf("---- addToTest begins. ----\r\n");
printf(" \r\n 3 plates\r\n");
hanoi(3, 'A', 'B', 'C');
printf("\r\n 4 plates\r\n");
hanoi(4, 'A', 'B', 'C');
printf("\r\n---- addToTest ends. ----\r\n");
}// Of addToTest
/**
The entrance.
*/
int main(int argc, char *argv[]) {
hanoiTest();
return 0;
}
此时直接移动:A -> C
当前在执行 A -4-> B 的中间转移,没有调用hanoi函数
此时直接移动:A -> B
当前在执行 A -4-> B 的最终转移, 出发地址:6487512,目标地址:6487520, 过渡地址:6487528
当前在执行 C -3-> B 的初始转移, 出发地址:6487416,目标地址:6487424, 过渡地址:6487432
当前在执行 C -2-> A 的初始转移, 出发地址:6487320,目标地址:6487328, 过渡地址:6487336
当前在执行 C -1-> B 的全部转移,出发地址:6487224,目标地址:6487232, 过渡地址:6487240
此时直接移动:C -> B
当前在执行 C -2-> A 的中间转移,没有调用hanoi函数
此时直接移动:C -> A
当前在执行 C -2-> A 的最终转移, 出发地址:6487320,目标地址:6487328, 过渡地址:6487336
当前在执行 B -1-> A 的全部转移,出发地址:6487224,目标地址:6487232, 过渡地址:6487240
此时直接移动:B -> A
当前在执行 C -3-> B 的中间转移,没有调用hanoi函数
此时直接移动:C -> B
当前在执行 C -3-> B 的最终转移, 出发地址:6487416,目标地址:6487424, 过渡地址:6487432
当前在执行 A -2-> B 的初始转移, 出发地址:6487320,目标地址:6487328, 过渡地址:6487336
当前在执行 A -1-> C 的全部转移,出发地址:6487224,目标地址:6487232, 过渡地址:6487240
此时直接移动:A -> C
当前在执行 A -2-> B 的中间转移,没有调用hanoi函数
此时直接移动:A -> B
当前在执行 A -2-> B 的最终转移, 出发地址:6487320,目标地址:6487328, 过渡地址:6487336
当前在执行 C -1-> B 的全部转移,出发地址:6487224,目标地址:6487232, 过渡地址:6487240
此时直接移动:C -> B
---- addToTest ends. ----
--------------------------------
Process exited after 0.04974 seconds with return value 0
请按任意键继续. . .
1、自顶向下,逐渐求精,函数调用
在程序设计中,“自顶向下”和“面向对象”是两类最重要也最基本的程序设计方法。
今天我们先介绍“自顶向下,逐步求精”的程序设计方法。
所谓“自顶向下”,即是把一个抽象的,困难的大问题分解为若干个小问题,如果认为小问题仍然不够简单可行,就再进一步分解,直到每一个小问题都简单易解。
而所谓“逐步求精”,则是对上述分解问题的过程进行完善和优化,做到把大问题合理而全面地分解,小问题简单而可行地解决。
2、递归与分治(基础与归纳)
在数学及程序设计方法学中为递归下的定义是这样的:若一个对象部分包含地包含它自己,或用它自己来定义它自己,则称这个对象是递归的;若一个过程直接或间接的调用自己,则称这个过程为递归的过程。
简而言之,递归方法就是直接或间接地调用其自身
3、不要跨层分析
跨层分析往往会忽略一些必要的条件以及数据的边界条件,要调用的方法必须经过合格的异常处理。
4、形参与实参(代码跟踪)
形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。
实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
5、有意义、规范的标识符
标识符的概念:
是指在程序中,我们自己定义的内容。比如类的名字、方法的名字和变量 的名字等等,都是标识符。
标识符的设定要符合阅读习惯,利于解读,同时要符合一定的规范。
6、时间复杂度
时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数. 时间复杂度常用大O表述,不包括这个函数的低阶项和首项系数。
在写程序的时候,要尽量减小时间的复杂度,缩短程序执行时间。
7、递归栈(代码跟踪)
优点:代码简洁、便于理解
缺点:时间和空间消耗大、可能存在栈溢出、可能存在重复计算
8、空间复杂度
空间复杂度是对一个算法在运行过程中占用内存空间大小的量度,记做S(n)=O(f(n)。
空间复杂度(Space Complexity)记作S(n) 依然使用大O来表示。利用程序的空间复杂度,可以对程序运行中需要多少内存有个预先估计。