(学习记录)
今天我们来唠一唠,关于线性表和递归的一些想法 .
一.我们先来谈一谈什么是递归
1.递归,我们都不陌生。非常经典的递归模型就是关于汉诺塔问题,在盘子数量很少时、我们可以总结出来一些归律,发现这些盘子的移动都有共同点、总是先将n-1个盘子借助于辅助塔先从第n个盘子上挪开、然后将第n个放置指定位置、然后重复这个过程(递归调用自己)、求解。
特点:
1.把一个很大规模的问题转化为多个与原问题相似的子问题。
2这些子问题最后都有一个出口、比如上面那个就是以大化小递归到只有一个盘子时,将其放置于指定位置。
二.线性表
线性表这个定义不多谈,相信大家都耳闻能详。
那么怎么用递归求解线性表的最大值呢?
我们给出顺序表的定义
#define MAXSIZE 100 /* 线性表最大长度 */
typedef int ElemType; /* 我们假设类型为int */
typedef struct {
ElemType data[MAXSIZE]; /* 线性表储存位置 */
int length; /* 线性表当前长度 */
}SqList;
//假设1,2,3,4,5,6,7,8,9,10已经放入
我们可以这样想
1.如果只有一个元素,那么他自己就是最大值
2.如果有两个、进行比较就可得出
3.如果有n个,那么我们先将其分为两个部分,分别求两个部分的最大值、进行比较就可的出
源码如下:
//L为传入的顺序表,不为空
//max为函数的要返回的最大值,
//low-high存储一段数据
void MaxValue(SqList *L, int low, int high, int *max){
int max1, max2; //max1储存前半段的最大值,max2储存后半段的最大值
int i, mid;
if(low == high)
*max = L->data[low]; //如果只有一个元素,他自己就是最大值
else{
mid = (low + high) / 2;
MaxValue(low, mid, &max1); //搜索前半段的最大值
MaxValue(mid + 1, high, &max2); //搜索后半段的最大值
*max = (max1 > max2) ? max1 : max2;
}
//主涵数
int main(){
SqList L;
int max, i;
L.length = 0; //初始化表长
for(i = 0;i < 10;++i){
L.data[i] = i + 1;
L.length++;
}
MaxValue(&L, 0, L.length - 1, &max); //必须以下标调用
printf("%d ", max);
return 0;
}
//就是这样,同理我们还能求出最小值,这个如果有兴趣,大家可以试着玩一下.
//我们也可以逆序输出线性表采用递归算法
//今天就到这,如果大家有更好的算法、欢迎留言、
//每天都是一种进步
}