1、什么是直接遞歸和間接遞歸
直接遞歸:一個函數或過程調用了自身
間接遞歸:過程或函數p調用過程或函數q,而過程或函數q又調用p。
2、消除遞歸一般要用到什么數據結構
棧數據結構
3、分析程序的執行過程
#include<stdio.h> void f(int n,int &m){ if(n<1)return; else{ printf("調用f(%d,%d)前,n=%d,m=%d\n",n-1,m-1,n,m); n--; m--; f(n-1,m); printf("調用f(%d,%d)后,n=%d,m=%d\n",n-1,m-1,n,m); } } main(){ int n=4,m=4; f(n,m); }
4、某遞歸算法的執行時間T(n)有以下遞歸關系:
T(1)=1 T (n)=T(n/3)+T(2n/3)+n 當n>1
5、采用直接推導的方法求解以下遞歸問題:
通過以上兩個求時間復雜度的問題,可以看出對於有兩個分支的表達式要用遞歸樹來求解,一個分支的可以直接化簡即可。
6、不帶頭結點的單鏈表L,遞歸算法逆序輸出:
#include<stdio.h> typedf struct Lnode{//存儲結構 int date; struct Lnode *next; }Node; void disp(Node *L){ if(L!=null) disp(L->next); printf("%d",L->date); }
7、不帶頭結點的單鏈表L,遞歸算法刪除第一個值為x的結點:
void Del_X(LinkList &L,ElemType x) { LNode *p; if(L==NULL) return ; if(L->data==x)//找到了 { p=L; free(p); }else//沒找到 { Del_X(L->next,x); } }
8、假設二叉樹采用二叉鏈存儲結構,所有結點的值都不相同,設計遞歸算法求值為x的結點的層次(根結點層次為1):
int Level(BTNode *bt,int h,int x) {//初始值 h=1 if(bt == NULL) return 0; if(bt->data == x ) return h; else { int lh = Level(bt -> lchild,h+1 ,x); // 在左子樹中查找 if(lh != 0) // 在左子樹中找到,返回其層次 return lh; else//在左子樹沒查找到 return Level(bt -> rchild, h+1 ,x); // 返回在右子樹的查找結果 } }
9、假設二叉樹采用二叉鏈結構存放,設計遞歸算法由二叉樹b復制產生二叉樹t
typedef struct node{ int data; struct node *lchild,*rchild; }BTnode; BTnode copy(BTnode *b){ Btnode *newnode; if(b==null) return null; else{ newnode=(BTnode*)malloc(sizeof(BTnode)); newnode->data=b->data; newnode->lchild=copy(b->lchild); newnode->rchild=copy(b->rchild); return newnode; } }