遞歸——習題


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;
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM