龙空技术网

【递归算法】第六章第五节:变量的作用

周银湘 178

前言:

目前大家对“八皇后问题数据结构”大概比较关心,你们都想要知道一些“八皇后问题数据结构”的相关内容。那么小编在网络上搜集了一些对于“八皇后问题数据结构””的相关文章,希望朋友们能喜欢,小伙伴们快快来学习一下吧!

第六章第五节:变量的作用域。

递归是一种有效地描述问题的方法。当一个问题蕴含递归关系且结构比较复杂时,采用递归算法往往比较自然简洁容易理解,但它是以牺牲时间消耗内存为代价的。函数的递归调用又可分为直接递归和间接递归两种情况:在函数A的定义中直接有调用函数A的语句,即自己调用自己就形成了直接递归调用;另一种是函数A的定义中出现调用函数B的语句,而函数B的定义中再出现调用函数A的语句,这就形成了间接递归调用。

注意比较递归算法和递推算法在前例和上例中它们都实现了求N的函数。但两者的实现机制是不同的。前者使用的是递推算法,后者使用的是递归算法。

从程序的控制结构看图:fac(3)递归调用引起内存空间的动态变化,迭代与递推算法是循环结构,它是一个不断由旧值递推出变量的新值的过程;而递归算法是一个选择结构,其中一个分支用于说明递归的方式,其它的分支用于说明递归的终止条件。

从算法的效率看通过前面的分析我们知道,递归算法的简洁易读是以牺牲时间、消耗内存为代价的。要正确地理解和使用递归算法,有的问题既可以用递归方法解决,也可以用迭代与递推的方法解决如求N!而有的问题不用递归方法是难以解决的。在非数值计算领域就存在很多必须用递归法才能解决的经典问题,如汉诺塔骑士游历八皇后问题(回溯法)等。

例汉诺塔(Tower of Hanoi)问题,这是一个有趣的古典数学问题:有3根小柱子ABC,A柱上有n个中间有孔的盘子,盘子大小不等,大的在下小的在上如下图所示,要求把这n个盘子从A柱移到C柱。在移动过程中可以借助B柱,每次只允许移动一个盘子且在移动过程中在三根柱子上始终都保持大盘在下小盘在上。要求编程打印出移动的步骤。

图:汉诺塔问题示意图[分析]:将n个盘子从A柱移到C柱可以分解为下面3个步骤;

·1、借助B柱;

·2、把A柱上剩下的一个盘子移到C柱上;

·3、当n值较大时,1个盘字从B柱移到C柱上(借助A柱)。

以上所述的3个步骤其实包含了两种操作;

·1、当n值较大1将多个盘子一根柱子移到另一根柱子上;当n值较这是一个递归的过程可以写一个hanoi函数实现;

·2、将1个盘子从一根柱字移到另一根柱子上,该问题不可以写个move函数实现。

当n值较大时该问题不用递归方法是难以解决的(char getone,char putone);//函数声明:cout<"The steps to mo下面给出完整的程序代码:coutk"The stes tcharcolumn B charcolumn C);

coutThe step函数声明voidsmove(chargetone;

couk*The charsputone);/函数声明intmain(void){。

coukcout<"Thesteps tomoving "smssdiskes:i(n=1)morolamove char getone char putone);

i(n=1)move(colum函数:将n个盘子从column A柱,借助于 column b柱移到 column c 柱上;

程序的3次ano(n-1column Acolumn C);程序的3次运彻/递归调用move (column Acolumn C);程序的3次ano(n-1column Acolumn B)。程序的3次运行绑递归调用程序的3次运行结果如下:

The steps to moving 1 diskes:A-->C。

The steps to moving 2 diskes:3 Enter the number of diskes:3√。

The steps to moving 3 diskes:The steps Theistepsto moving 3 diskes:A--CA->B。

第五节:变量的作用域与存储类型。变量是对数据存储空间的抽象,c语言的每一个变量都具有两个属性:数据类型和数据的存储类型。数据类型确定了数据的结构,如数据的存储格式和需占用内存空间的大小等。

存储类型则说明了数据在内存中的存储位置并决定了它的生存期和作用。变量的生存期是指它从获得内存空间到空间释放之间的时期。

函数内变量的作用域是指变量在程序中可以被使用的范围。

·一、局部变量与全局变量。根据变量的作用范围可将变量分为局部变量与全局变量。

→在函数中由花括号括起来的分程序中定义的变量为局部变量。

→局部变量只能在本函数内或分程序的范围内有效作用于函数中的形式参数也是局部变量。

→它只在自己的函数内有效到目前为止之前所用到的变量都是局部变量。

定义在所有函数之外的变量为全局变量,全局变量又称为外部变量,它的有效范围作用域是从定义该变量的位置开始到其原文件结束。如果要在此范围之外使用该全局变量则需要在使用该变量的位置之前。

通过option关键字先声明该变量未已经定义的全局变量然后才能使用它全局变量的主要应用场合。当某个变量需要被多个函数共同使用时,而且其意义与数值是明确的不会引起混乱,则可定义该变量为全局变量局部变量可以与全局变量同于内层变量程序块中的变。也可以与外层变量同号,由于它们所处的位置不同作用范围不一样,它们在内存中占用的是不同的存储单元部变量局部。因而不会引起系统识别的错误则,即局部变量局部有效全局变量,全局有效。

当全局变量与局部变量同名,或内层变量与外层变量同名时,局部优先于全局内层优先于外层。using nam如果嵌套块中有同名变量服从局部优先原则,即在内层块中屏蔽外层块中的同名变量,外层块中的同名变量变为不可见的变量。

using nam换句话说内层块中变量的作用域为内层块,外层块中变量的作用域为外层,除去包含同名变量的内层块部分,例局部变量使用示例。

程序简单化 our stream,using names space std。void fun (void) int t=5,int函数中的局部变量,cout < fun (中的t = t < n)};int main (void) float t=3.8;main(函数中的局部变量fun(intt=100;程序块中的局部变量cout <<<<<<<<<<<<<】n;程序运行结果:coutss main (中的t)<<"n return0}。

标签: #八皇后问题数据结构