1. 程式人生 > >如何使用C語言實現遞迴呼叫

如何使用C語言實現遞迴呼叫

遞迴的定義:

程式呼叫自身的程式設計技巧稱為遞迴,就是執行時呼叫了自己。

什麼樣的問題適合使用遞迴方式:

如果一個大問題可以拆分成幾個小問題,其中有n個小問題和原來的大問題本質一樣,只是難度小一些。這種問題可以考慮採用遞迴的方式解決。

遞迴函式的編碼原則:

1、編寫語句把問題的拆分方式描述出來。

2、在函式的開頭寫一個分支語句處理不可拆分的情況(這個分支必須可以讓函式結束)

下面講解幾個例子瞭解什麼是遞迴。

例一:古典問題——有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問第三年每個月的兔子總數為多少?(提示:兔子的規律為數列1,1,2,3,5,8,13,21....)

PS:如果生的都是公兔子或者母兔子就不用算了,不知道大家有沒有想過,想到過的請舉手!

月份 1 2 3 4 5 6 7 8 9 10
小兔子 1 0 1 1 2 3 5 8 13 21
大兔子 0 1 1 2 3 5 8 13 21 34
總數 1 1 2 3 5 8 13 21 34 55

通過表格分析,可以看出:

F(n) = F(n-1) + F(n-2);

#include
int fei(int num){
    if(num <= 2){
        return;
    }
    return fei(num - 1) + fei(num - 2);
}
int main(){
    int num1 = 0;
    printf("請輸入第三年的月份:\n");
    scanf("%d",&num1);
    printf("第三年第%d個月生%d只兔子",num1,fei(36 + num1));
    return 0;
}


例二:趣味問題——年齡。有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最後問第一個人,他說是10歲。請問第五個人多大?

#include
int age(int num){
    if(num == 1){
        return 10;
    }
    return age(num - 1) + 2;
}
int main(){
    printf("第5個人的年齡是%d\n",age(5));
    return 0;
}

例三:趣味問題——猴子吃桃。海灘上有一堆桃子,五隻猴子來分。第一隻猴子把這堆桃子憑據分為五份,多了一個,這隻猴子把多的一個扔入海中,拿走了一份。第二隻猴子把剩下的桃子又平均分成五份,又多了一個,它同樣把多的一個扔入海中,拿走了一份,第三、第四、第五隻猴子都是這樣做的,問海灘上原來最少有多少個桃子?

#include
int peach(int num){
    if(num == 1){
        return 6;
    }
     return ((peach(num - 1) + 1) * 5);   
}
int main(){
    printf("總共有桃子數為:%d\n",peach(5));
    return 0;
}