c语言汉诺塔递归算法_自学编程C语言程序设计递归 汉诺塔问题

8f45f029d586be68ff176e12f8d7d660.png

本人自学编程刚读完谭浩强的这版C语言程序设计,从什么都不懂的小白到现在仅有一些思维上的感想。

自己用十天认真读完了其实感觉受益还挺大,自己其实在读之前在MOOC上先看了一个《计算机导论》的视频教程,看完之后总结只有一个点 就是要有计算机的思维方式,因为计算机是01二进制的,所以要学会如何与计算机沟通,充分了解计算机及其结构,它只是做一个入门的思维了解,然后当我看这本书用以导入思维方式,是一种过渡!总之当看完这本书之后感觉以后要走的路还有很长(要看的书还很多),它并不能让你编出什么像样的程序,可能入门都不算,好了下面说下自己读的过程遇到的比较难的一些!

自己用的是Dev-C++而且可以练下敲代码的能力,VC++的化书上建议用的2010版,我下载的2019的个人免费版发现它不支持c语言的一些语法,毕竟c太基础!

总结其实指针那章只要仔细看问题并不大,链表那段要有指针前面的基础,只要认真看也没事! 自己在递归那小结卡了一整天,好在最后过了! 讲下遇到的问题:汉诺塔问题

5be8e2f5f962335765dce1c1cb3db43f.png

e17150dc3b9d9be333bac99665bcc2e8.png

代码如下:

1 int main()

2 {

3 void hanoi(int n,char one,char two,char three); //对hanoi函数声明

4 int m;

5 printf("input the number of diskes:");

6 scanf("%d",&m);

7 printf("the step to move %d diskes:n",m);

8 hanoi(m,'A','B','C');

9 return 0;

10 }

11 void hanoi(int n,char one,char two,char three) //定义hanoi函数

12 //将n个盘子从one借助two移动到three

13 {

14 void move(char x,char y);

15 if (n==1)

16 move(one,three);

17 else

18 {

19 hanoi(n-1,one,three,two);

20 move(one,three);

21 hanoi(n-1,two,one,three);

22 }

23 }

24 void move(char x,char y)

25 {

26 printf("%c-->%cn",x,y);

27 }

上面图片的解决思路与解决思想已经很清楚,我只是说下程序是怎么运行的:从第八行开始 输入一个整数型 m=3(假设)则第八行hanoi(m,'A','B','C')开始调用函数 把数据传给下面的11行 void hanoi(int n,char one,char two,char three) 显然 这时候 是这样的:

n=3 one=A two=B three=C

void hanoi函数再把 数据向下分配 执行void move函数 (char x,char y)

if(n==1) // 如果n=1则执行 move(one,three)// 显然这里是n=3(上面假设的传下的数据)

则执行 else { hanoi (n-1,one,three,two ; move(one,three) ;

hanoi(n-1,two,one,three) ;} 这里比较难思考:具体在下

【1】 n=3 则19行 函数hanoi(n-1,one,three,two);调用11行函数void hanoi(int n,char one,char two,char three) 本身, 一直把这个函数执行结束 因为19行函数后面是分号。

循环@1 【先放下函数执行,思考这时的函数们的每一个的数据】

14 void move(char x,char y); 15 if (n==1) 16 move(one,three); 17else

19 hanoi(n-1,one,three,two);20 move(one,three);21 hanoi(n-1,two,one,three);

第一 16 行的接收数据是 one=A three=C 19 行接收数据是 (“n=3”n-1=2,one=A,three=C,two=B)20 行 (one=A,three=c)21行(“n=3”n-1=2,two=B,one=A,three=C)数据介绍完 继续下面的程序执行:

【1】 则19行 函数hanoi(n-1,one,three,two);调用11行函数void hanoi(int n,char one,char two,char three) 本身 上面说了19行接收到的数据是(2,one=A,three=C,two=B)因为是调用它本身void hanoi(int n,char one,char two,char three) 则它的本身接 收到 数据就是19行的数据 是这个样子 void hanoi(2,one=A, two=C, three=B) 那么这个数据再向下传就又是一个循环体和以下传输的数据

@循环1.1 14 void move(char x,char y); 15 if (n==1) 16 move(one=A,three=B); 17else

19 hanoi(1,one=A,three=B,two=C);20 move(one=A,three=B);21 hanoi(1,two=C,one=A,three=B);

【1.1】继续执行程序函数hanoi(n-1,one=A,three=B,two=C) 又一次调用函数本身此时传给

函数的数据void hanoi(int n=1, one=A,two=B, three=C) 继续执行函数体 14 void move(char x,char y); 15 if (n==1) 16 move(one,three); 17else

19 hanoi(n-1,one,three,two);20 move(one,three);21 hanoi(n-1,two,one,three);

则此时因为n=1 则执行move(one=A,three=C) < 输出A--C 第一个> 那么程序返回上一循环@循环1.1 14 void move(char x,char y); 15 if (n==1) 16 move(one=A,three=B); 17else

19 hanoi(1,one=A,three=B,two=C);20 move(one=A,three=B);21 hanoi(1,two=C,one=A,three=B);

执行 20 move(one=A,three=B); <输出A--B 第二个> 接下来再执行21 hanoi(1,two=C,one=A,three=B); 函数hanoi(1,two=C,one=A,three=B);调用自己本身函数的数据void hanoi(int n=1, one=C,two=A, three=B)函数再向下传数据 继续执行程序 @ 循环1.1 14 void move(char x,char y); 15 if (n==1) 16 move(one=C,three=B); 17else

19 hanoi(n-1,one,three,two);20 move(one,three);21 hanoi(n-1,two,one,three); 此时n=1 则执行move(one=C,three=B) <输出C--B第三个>

注意 调用函数void hanoi(int 2, one=A,two=C, three=B) 循环体

《@循环1.1 14 void move(char x,char y); 15 if (n==1) 16 move(one=A,three=B); 17else

19 hanoi(1,one=A,three=B,two=C);20 move(one=A,three=B);21 hanoi(1,two=C,one=A,three=B); 》

执行完了 注意这一步,再返回 上一循环体

循环@1

14 void move(char x,char y); 15 if (n==1) 16 move(one=A,three=C); 17else

19 hanoi(3-1,one=A,three=C,two=B);20 move(one=A,three=C);21 hanoi(3-1,two=B,one=A,three=C);

显然 19行 hanoi(3-1,one=A,three=C,two=B);全部执行完了,接下来执行20 move(one=A,three=C);(有点烧脑我也从新有看一遍)

则输出<输出A--C第四个>

在执行21 hanoi(3-1,two=B,one=A,three=C);再调用函数得到数据void hanoi(int 2,char one=B,char two=A,char three=C) 主函数 向下传输数据 @2

void move(char x,char y); 15 if (n==1)

16 move(one=B,three=C);

17 else

18 {

19 hanoi(n-1,one=B,three=C,two=A);

20 move(one=B,three=C);

21 hanoi(n-1,two=A,one=B,three=C);

此时n=2 则执行 19 hanoi(2-1,one=B,three=C,two=A);那么调用主函数void hanoi(int 1,char one=B,char two=C,char three=A) 向下传数据 则void move(char x,char y); 15 if (n==1)

16 move(one=B,three=A); <输出B--A> 再返回 @2 执行20 move(one=B,three=C); <输出B--C> 再返回21 hanoi(n-1,two=A,one=B,three=C);调用函数并得到数据 主函数void hanoi(int 1,char one=A,char two=B,char three=C) 向下传输数据 void move(char x,char y);

15 if (n==1)

16 move(one=A,three=C); 则输出数据<输出A--C>

程序转向输出程序!

感觉好难这只是开始,接下来自己搞一下 高数 与 数据结构 总之这些都是基础吧!方向是Java s/b !加油!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值