遞歸

性質

  1. 調用本身(入棧)
  2. 問題規模縮小
  3. 遇到終止條件跳出(出棧)
  4. 受現實問題限制,如棧的大小不夠而失敗.支持遞歸的語言必須支持「棧」結構

應用

階乘

#include<stdio.h>

long factorial( int n ){
    return n==0||n==1 ? 1 : n * factorial(n-1);
}

void main(){
    long iResult = factorial(5);
    printf("5的階乘爲:%ld",iResult);
    getchar();
}

斐波那契數列

#include<stdio.h>

long fibo( int n ){
    return n==0||n==1 ? 1 : fibo(n-1) + fibo(n-2);
}

void main(){
    long iResult = fibo(5);
    printf("斐波那契數列的第5項爲:%ld",iResult);
    getchar();
}

漢諾塔

#include<stdio.h>

void move(char x, int n, char z){
    printf("把圓盤 %d 從柱子 %c 移動到 %c 上\n",n,x,z);
}

void hanoi(int n, char x, char y, char z){
    if(n==1)
        move(x,1,z);
    else
    {
        hanoi(n-1, x, z, y);    //把1~n-1個圓盤 從x移動到y
        move(x, n, z);          //第n個圓盤 從x移動到z
        hanoi(n-1, y, x, z);    //把1~n-1個圓盤 從y移動到z
    }
}

void main(){
    printf("只有兩個圓盤時:\n");
    hanoi(2,'X', 'Y', 'Z');
    printf("\n三個圓盤時:\n");
    hanoi(3,'X', 'Y', 'Z');
    getchar();
}

楊輝三角形


1
1 1
1 2 1
1 3 3 1
1 4 6 4 1


  • 邊界爲1,內部爲爲上一行的兩個元素和
  • 假設f(row , col)表示第row行,第col列的元素
    1. f(row , col) = 1 (col ==1 || row ==col),遞歸的終止條件
    2. f(row , col) = f(row-1 , col-1) + f(row-1 , col),上一行的兩個元素和
#include<stdio.h>

int getElem(int row, int col){
    if( col==1 || row==col)
        return 1;
    else
        return getElem(row-1,col-1) + getElem(row-1,col);
}

void pascal_triangle(int n){
    int row,col;
    for(row=1; row<=n; ++row){
        for(col=1; col<=row; ++col)
            printf("%d\t",getElem(row,col));
        printf("\n");
    }
}

void main(){
    pascal_triangle(5);
    getchar();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章