遞歸--39級臺階+出棧順序

39級臺階

 

小明剛剛看完電影《第39級臺階》。離開電影院的時候,他數了數禮堂前的臺階數,恰好是39級!

站在臺階前,他突然又想着一個問題:

如果我每一步只能邁上1個或2個臺階。先邁左腳,然後左右交替,最後一步是邁右腳,也就是說一共要走偶數步。那麼,上完39級臺階,有多少種不同的上法呢?

請你利用計算機的優勢,幫助小明尋找答案。

 

#include <iostream>

#include<stdio.h>

using namespace std;

int n,s;

int f(int q,int t)

{

    if(q>0)t++;  //有臺階可走

    if(q>=2) return f(q-1,t)+f(q-2,t);  //選擇走一步或者走兩步

    if(t%2==0)  s++;   //q=0,1共走偶數步,方法加1

    return 0;

}

int main()

{

    while(scanf("%d",&n)!=EOF){

    s=0;

    f(n,0);

    printf("%d\n",s);

    }

    return 0;

}

 

出棧順序

 

X星球特別講究秩序,所有道路都是單行線。

一個甲殼蟲車隊,共16輛車,按照編號先後發車,夾在其它車流中,緩緩前行。

路邊有個死衚衕,只能容一輛車通過,是臨時的檢查站,如圖所示。

X星球太死板,要求每輛路過的車必須進入檢查站,也可能不檢查就放行,也可能仔細檢查。

如果車輛進入檢查站和離開的次序可以任意交錯。那麼,該車隊再次上路後,可能的次序有多少種?

爲了方便起見,假設檢查站可容納任意數量的汽車。

顯然,如果車隊只有1輛車,可能次序1種;2輛車可能次序2種;3輛車可能次序5種。

 

#include <stdio.h>

int f(int n,int m)

{

    if(n==0)

        return 1;

    if(m==0)

        return f(n-1,1);

    return

        f(n,m-1)+f(n-1,m+1);

}

int main()

{

    int a;

    while(scanf("%d",&a)!=EOF){

        printf("%d\n",f(a,0));

    }

    return 0;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章