函数的程序设计实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

函数的程序设计实验

实验报告

1、回答问题:

根据程序1,试分析:

1.1全局变量、局部变量、静态变量的特点是什么

动态局部变量:静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。

静态局部变量:静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。

动态全局变量:全局作用域,整个程序都可以使用。

静态全局变量:静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

根据程序2,试分析:

2.1 根据盘子数的增长,hanoi函数被调用的次数是如何变化的?

2n-1

2.2 设盘子的移动次数为H(n)。汉诺塔问题的递归表达式:

H⑴ = 1

H(n) = 2*H(n-1)+1 (n>1)

那么就能得到H(n)的一般式:

H(n) = 2^n - 1 (n>0)

根据一般式,可以不使用递归,就能得到盘子的移动次数。

请根据这一现象,分析递归方法的优缺点。

递归好处:代码更简洁清晰,可读性更好

递归可读性好这一点,对于初学者可能会反对。实际上递归的代码更清晰,但是从学习的角度要理解递归真正发生的什么,是如何调用的,调用层次和路线,调用堆栈中保存了什么,可能是不容易。但是不可否认递归的代码更简洁。一般来说,一个人可能很容易的写出前中后序的二叉树遍历的递归算法,要写出相应的非递归算法就比较考验水平了,恐怕至少一半的人搞不定。所以说递归代码更简洁明了。

递归坏处:由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多。而且,如果递归深度太大,可能系统撑不住。

2.3 请比较递归与迭代两种方法,包括控制结构,终止测试,计算代价,程序直观度。

递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。

递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。

递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止。

使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计数器,直到计数器值使循环条件失败;递归不断产生最初问题的简化副本,直到达到基本情况。迭代和递归过程都可以无限进行:如果循环条件测试永远不变成false,则迭代发生无限循环;如果递归永远无法回推到基本情况,则发生无穷递归。递归函数是通过调用函数自身来完成任务,而且在每次调用自身时减少任务量。而迭代是循环的一种形式,这种循环不是由用户输入而控制,每次迭代步骤都必须将剩余的任务减少;也就是说,循环的每一步都必须执行一个有限的过程,并留下较少的步骤。

根据程序3,试分析:

3.1 函数swap能否实现对main函数中的a,b值的交换呢?为什么?

可以,直接将地址存储的数据交换

3.2 如果把Swap中的a和b分别改成x和y,会发生什么变化吗?如果将它们换成别的名称呢?函数的形参名需要和main函数中的实参名保持一致吗?

不会,不一定要一致

3.3 请你编写一个新的swap函数,要求使用传递变量地址的方法,实现对main 函数中a,b值的交换。

void Swap(int a, int b)

{

int temp;

temp = b;

b= a;

a = temp;

printf("In Swap():a = %d, b = %d\n", a, b);

}

2、完成下列表格。

表4 程序3的运行分析

相关文档
最新文档