博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
栈与递归的实现
阅读量:6589 次
发布时间:2019-06-24

本文共 1533 字,大约阅读时间需要 5 分钟。

  对于栈有些问题还不是很熟悉,所以暂时需要些时间去理解,需要多写些代码去体会,,栈还有一个重要应用是在程序设计语言中实现递归,所以这次主要是讲递归的实现,大家熟悉的阶乘函数,2阶Fibonacci数列和Ackerman函数等,其次还有的数据结构,如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归的描述,另外还有一类问题,虽然问题本身没有明显的递归结构,但是递归求解比迭代求解更简单,如八皇后问题、Hanoi塔问题等。

  递归是一种数学上分而治之的思想,它将大型复杂问题转化为与原问题相同但规模较小的问题进行处理,数学表示如下:

      

 

  下面我以一个八皇后问题来说一下这儿的递归问题,在一个8X8国际象棋中,有8个皇后,每个皇后占一格,要求皇后间不会出现相互“攻击”的现象,即不能有两个皇后处在同一行,同一列或者同一对角线上。那么怎么来实现这个想法呢?下面是我的算法思路:先给两个了、变量i,j赋值为1,从第i行开始,恢复j的当前值,判断第j个位置。1、位置j可放入皇后,标记位置(i,j),i++,j = 1; 2、位置j不可放入皇后,j++,i = 1;  3、当j>8时候,j--,继续上述循环; 4、第八行有位置可以放入皇后。

  实现代码如下:

1 #include 
2 #define N 8 3 4 typedef struct _tag_Pos 5 { 6 int ios; 7 int jos; 8 } Pos; 9 10 static char board[N+2][N+2];11 static Pos pos[] = { {-1, -1}, {-1, 0}, {-1, 1} };12 static int count = 0;13 14 void init()15 {16 int i = 0;17 int j = 0; 18 for(i=0; i
N )71 {72 count++; 73 printf("Solution: %d\n", count); 74 display(); 75 getchar();76 }77 else78 {79 for(j=1; j<=N; j++)80 {81 if( check(i, j) )82 {83 board[i][j] = '*'; 84 find(i+1); 85 board[i][j] = ' ';86 }87 }88 }89 }90 91 int main()92 {93 init();94 find(1);95 96 return 0;97 }
queen

 

  编译结果如下图:

当不断按Enter的时候,会陆续出现Solution一直到Solutioin92,再按Enter会退出了。如下图

 

小结:

  递归是一种将问题分而治之的思想,解决问题的时候首先就要建立递归的模型;

  如上图到Solution92的时候就结束了,所以解决递归问题首先要有边界条件,否则将死循环;

 

转载地址:http://uduio.baihongyu.com/

你可能感兴趣的文章
通信协议之广播---recvfrom 放回客户端的ip地址第一次全为0.0.0.0
查看>>
oracle-3-子查询和常用函数
查看>>
item2
查看>>
云计算面临安全挑战
查看>>
C# 线程手册 第三章 使用线程 Monitor.TryEnter()
查看>>
分享11个超棒的移动应用(mobile apps)开发解决方案
查看>>
C/C++获取文件大小
查看>>
深入理解Java内存模型(五)——锁
查看>>
Chalubo僵尸网络来袭 IOT设备或将受到DDoS攻击
查看>>
如何实现百万TPS?详解JMQ4的存储设计
查看>>
这么说吧,NIO很简单,其实就是个牛逼IO
查看>>
使用Python快速获取公众号文章定制电子书(二)
查看>>
iOS下JS与OC互相调用(七)--Cordova 基础
查看>>
Three.js 关于立方体贴图产生边缘锯齿问题
查看>>
Nacos v0.7.0:对接CMDB,实现基于标签的服务发现能力
查看>>
【开发问题记录①】关于滑动CollectionView时ContentSize变化的问题
查看>>
java中GC的基本概念
查看>>
building xxx gradle project info的解决办法
查看>>
Vagrant (一) - 基本知识
查看>>
在 CentOS 7 上搭建 Jenkins + Maven + Git 持续集成环境
查看>>