. .
. . .
数据结构作业报告
—①N矩阵的n次方运算报告
—②折半查找报告
:江海强
班级:070921班
学号上机时间:2010-9-29
报告时间:2010-9-10
摘要
1.实验目的
本实验主要是让我们了解函数的调用与返回,理解递归函数的执行过程,学会利用递归函数解决实际问题。
2.实验方法
①本程序利用全局数组变量b[N][N]来统筹整个程序,有一个主函数和一个子函数,其中子函数为矩阵换算的函数,也作为递归函数。而递归就是本程序的主要实验方法。
②本程序也定义了一个全局指针变量*mid,也是有一个主函数和一个子函数,其中子函数为折半查找的函数,也作为递归函数。而递归也就是本程序的主要实验方法。
3.实验结果
①由运行出来的结果可以看出,即使为一次方,此矩阵运算的结果与实际运算得到的结果完全是一样,所以此程序是正确的,成功的。
②由运行出来的结果可以看出,折半查找所找到的数的位置经过验证也是正确、无误的。即使输入要查找的数不在数组中,则程序会输出error来说明查找失败。故此程序也是正确的,成功的。
注:这两个程序是用C语言编辑完成的。其中①代表的是N矩阵的n次方运算的程序设计,②代表的是折半查找的程序设计,如果没有特别说明,以下的①②都是代表这样的意思。
容
一.问题重述
①给出一个N阶矩阵A,利用递归编程快速计算矩阵A的n次幂
②给出一组按从小到大排序的数组,利用递归编程实现折半查找,查找出所要求查找的数所在的位置
二.算法描述
这两个程序除了运用一些条件语句,判断语句之外,主要运用了递归算法。
①本程序中的子函数的复杂度为O(N2+N2+N3),即为O(N3),而递归算法运用了子函数N-1次,所以复杂度为(N-1)O(N3)。
②本程序中折半查找的平均查找长度为ASL,要考虑到是否查找成功,则
开始
开始
输入N阶矩阵a
输入N阶矩阵a[N][N]
结束调用子函数jzhs
结束
调用子函数jzhs()
输出运用for循环计算矩阵相乘
输出
运用for循环计算矩阵相乘
再自身调用子函数jzhs()
再自身调用子函数jzhs()
再调用
再调用……直到调用了子函数N-1次为止
再运用for循环计算矩阵相乘
再运用for循环计算矩阵相乘
①
结束输出开始
结束
输出
开始
直到调用到*mid=key或者key不存在数组中
直到调用到*mid=key或者key不存在数组中
输入数组a[N]和所要查找的数key
自身调用子函数search(a,key,lo,(mid--))自身调用子函数search(a,key,(mid++),hi)
自身调用子函数search(a,key,lo,(mid--))
自身调用子函数
search(a,key,(mid++),hi)
调用子函数seach()
是
是
*mid>key?否
*mid>key?
否
运用for语句赋值*mid,比较*mid与key的大小
先不讨论*mid=ke
先不讨论
*mid=key
②
三.变量说明
①全局变量N代表的是矩阵为N阶,全局变量n代表的是N阶矩阵的n次方,而a[N][N]则代表的是N阶矩阵。
②全局变量N代表的是数组a[N]的个数,key是所要查找的数,*lo、*hi和*mid分别代表数组的头、尾和中间指针,并且随着运算而变化。
四.函数与思路说明
①本程序分为一个主函数和一个子函数,其中子函数为jzhs()子函数。其中jzhs()子函数将主函数中调入的N阶矩阵,通过三个for循环,计算出N阶矩阵的二次方。再将得出的矩阵和原来的矩阵自身调用,输入到jzhs()子函数中,即得到N阶矩阵的三次方,利用这样的递归进行运算直到算出矩阵的n次方为止。
②本程序也分为一个主函数和一个子函数,其中子函数为seach()子函数。其中seach()子函数将主函数调入的数组,通过指针指向数组的头和尾,求出*mid指向中间数组。若*midkey,则调用自身函数search(a,key,lo,(mid--)),直到查找到所要查的数或者要查找的数不在数组中为止。
②:
②:
1.第一次运行结果:
从小到大排序好的数列为:
1 2 3 4 5 6 7 8 9
要查找的数是:4
查找到的数是:4
其存储位置为:0012FF60
2.第二次运行结果:
从