递归知识点
递归的定义
什么是递归?若在一个函数,过程或数据结构定义的内部又直接(或间接)出现定义本身的应用,则成为他们是递归的。
对于能够分解成几个简单且解法相对活类似的子问题,来求解,便成为递归求解,例如,在求解4时先求解3,然后再进一步分解进行求解,这种求解方式叫做“分治法”
采取“分治法”进行递归求解的问题需要满足以下三个条件:
1 能将一个问题转换变成一个小问题,而新问题和原问题解法相同类同,不同的仅仅是处理的对象。并且这些处理更小且变化有规律的
2 可以通过上述转换而使得问题简化
3 必须有一个明确的递归出口,或成为递归边界
数据结构是递归的
其数据结构本身具有递归的特性
例如。对于链表,其结点LNode的定义由数据域data和指针next组成,而指针域next是一种知性LNode类型的指针,即LNode的定义中又用到了其自身,所以链表是一种递归的数据结构
void TraverseList(LinkList p){
//递归终⽌
if(p == NULL) return;
else{
//输出当前结点的数据域
printf("%d",p->data);
//p指向后继结点继续递归
TraverseList(p->next);
}
}
问题的解法是递归的
有一类问题,虽然问题本身并没有明显的递归结构,但是采样递归求解比迭代求解更简单,如Hanoi塔问题,八皇后问题,迷宫问题
递归过程和工作栈
在主函数main中调⽤函数first, ⽽在函数first ⼜嵌套调⽤了second 函数. 则,当我们执⾏当前在执⾏的firt
文字很多,等消化后估计理解的就没那么多了
栈 实操
链式存储栈结构
#define MAXSize 20
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElementType;
结点定义
typedef struct StackNode{
ElementType data;
struct StackNode *next;
}StackNode,*LinkStackPatr;
栈定义
typedef struct {
LinkStackPatr top;
int count;
}LinkStack;
/* 构造一个空寨*/
Status initStack(LinkStack *S){
S->top = NULL;
S->count = 0;
return OK;
}
/* 把链栈S置为空栈*/
Status ClearStak(LinkStack *S){
LinkStackPatr p,q;
p = S->top;
while (p) {
q = p;
p = p->next;
free(q);
}
S->count = 0;
return OK;
}
/* 若栈S为空栈,则返回TRUE 否则返回FALSE*/
Status StackEmpty(LinkStack S){
if (S.count == 0) {
return TRUE;
}
return FALSE;
}
/* 返回S的元素个数,即栈的长度*/
int StackLength(LinkStack S){
return S.count;
}
/* 若链栈S不为空 则用e返回栈顶元素,并返回OK,否则返回ERROR*/
Status GetTop(LinkStack S,ElementType *e){
if (S.top == NULL) {
return ERROR;
}else
*e = S.top ->data;
return OK;
}
/* 插入元素e到栈链S(成为新的栈顶*/
Status Push(LinkStack *S,ElementType e){
//创建新结点temp
LinkStackPatr temp = (LinkStackPatr)malloc(sizeof(StackNode));
//赋值
temp->data = e;
temp->next = S->top;
S->top = temp;
S->count ++;
return OK;
}
/*若栈部位空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERRROR*/
Status Pop(LinkStack *S,ElementType *e){
LinkStackPatr p;
if (StackEmpty(*S)) {
return ERROR;
}
//将栈顶元素赋值给*e
*e = S->top->data;
p = S->top;
S->top = S->top->next;
free(p);
S->count--;
return OK;
}
/*遍历栈*/
Status StackTraverse(LinkStack S){
if (StackEmpty(S)) {
return ERROR;
}
LinkStackPatr node;
node = S.top;
do {
printf("%d ",node->data);
node = node->next;
} while (node);
return OK;
}
int main(int argc, const char * argv[]) {
// insert code here...
printf("Hello, World!\n");
int j;
LinkStack s;
int e;
if(initStack(&s)){
for(j=1;j<=10;j++)
Push(&s,j);
}
printf("栈中元素依次为:");
StackTraverse(s);
Pop(&s,&e);
printf("弹出的栈顶元素 e=%d\n",e);
StackTraverse(s);
printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));
GetTop(s,&e);
printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s));
// ClearStack(&s);
printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
return 0;
}