0%

C和数据结构——递归的学习和应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
1,直接递归,
2,简介递归
使用情况:
1,数据结构本身是递归的,比如链表的类型定义。
2,数学问题:比如汉诺塔问题
3,问题本身是递归问题:比如兔子数列
*/

/*递归模型
1,终止条件:递归出口/确定了什么时候递归结束
2,递归关系:递归体/确定了递归进行的方式
递归的目的:以大化小,直到最简单的问题。
程序化:可以发现,在递归问题中,先出现的数据,到最后才能
得到结果,这正符合了栈的思想:先进后出!
递归工作栈:
*/

/*汉诺塔问题:
1,n ==1,时,直接将盘子移动到B//临界条件
2, n>1,时,将A上的n-1个盘子移动到B,此时C作为过渡
3,用A作为过渡,将B上的n-1个盘子移动到C
4,如此进行,循环往复。
*/
//汉诺塔问题的代码实现
void HanNuoTa(int n, char A, char B, char C)
{
//A是最初的柱子,C是目标柱子
if (n == 1)
printf("MOVE%s ", A, "to %s", C) else
{
HanNuoTa(n - 1, A, C, B);
printf("MOVE %s", A, "to %s", C);
HanNuoTa(n - 1, B, A, C);
}
}

//通过递归计算数组中的最小值
float f(float A[], int i)
{
float m;
if (i == 0) //递归出口
return A[0];
else
{ //递归体:
m = f(A, i - 1); //初值
if (m > A(i)) //判断A[i-1]和A[i]的大小
return A[i];
else //返回两个数中的最小的那个
return m;
}
}

//递归计算结点的个数,链表不带头结点
int count(LNode *L)
{
if (L == NULL) //出口
return 0;
else
return count(L->next) + 1; //递归体
}

//递归输出结点的值
void Travers(LNode *L)
{
if (L == NULL) //出口
return;
printf("%d/t/n", L->data); //递归体
Travers(L->next);
}

//倒序输出单链表结点的值
void TraverseR(LNode *L)
{
if (L == NULL) //出口
return;
//递归体
TraverseR(L->next);
printf("%d/t/n", L->data);
}

//删除以L为首结点的单链表中值为x的第一个结点
void del(LNode *&L, ElemType x)
{
LNode *t;
if (L == NULL)
return;
if (L->data == x) //出口
{ //简单的删除结点的操作
t = L;
L = L->next;
free(t);
return;
}
else //递归体
del(L->next, x);
}

//利用递归删除结点值为x的所有的结点
void delall(LNode *L, ElemType x)
{
LNode *t;
if (L == NULL)
return;
if (L->data == x) //出口
{
t = L;
L = L->next;
delall(L, x);
}
else
delall(L->next, x); //递归体
}

//输出最大值结点
ElemType maxv(LNode *L)
{
ElemType m;
if (L->next == NULL) //出口
return L->data;
m = maxv(L->data);
if (m > L->data) //递归体
return m;
else
return L->data;
}

//输出最小结点值
ElemType minv(LNode *L)
{
ElemType m;
if (L->next == NULL)
return L->data;
m = minv(L->next);
if (m > L->data)
return L->data;
else
return m;
}