递归与线性表

(学习记录)

 今天我们来唠一唠,关于线性表和递归的一些想法 .

一.我们先来谈一谈什么是递归

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;

//就是这样,同理我们还能求出最小值,这个如果有兴趣,大家可以试着玩一下.

//我们也可以逆序输出线性表采用递归算法


//今天就到这,如果大家有更好的算法、欢迎留言、

                                                        

                                                                                                //每天都是一种进步

}

猜你喜欢

转载自blog.csdn.net/qq_40282585/article/details/80304467