蓝桥杯——递归三:递归的一些实际应用(2017.2.22)

来源:互联网 发布:狗狗用品专卖店淘宝 编辑:程序博客网 时间:2024/04/27 17:44

1. 猴子吃桃问题

源代码:

#include <stdio.h>int fun(int n){if(n==1)return 1;elsereturn (fun(n-1)+1)*2;}int main(){int n;while(scanf("%d",&n)!=EOF)printf("%d\n",fun(n));return 0;}
程序截图:


2. h阶楼梯下楼问题(对比更容易理解的“n阶楼梯上楼问题”)

        从楼上走到楼下共有h个台阶,其中每一步有3种走法:走1个台阶;走2个台阶;走3个台阶。问共有多少种下楼方案?

源代码:

法一:

#include <stdio.h>int count;int take[105];                    //记录某一步所走步数 void Try(int i,int s)             //求方案数 {int j,k;for(j=3;j>0;j--){if(i>=j){take[s]=j;            //记录第s步走j个台阶if(i==j)              //如果已经到了楼下 {count++;printf("方案%d:",count);for(k=1;k<=s;k++) //输出本方案的每一步printf("%d ",take[k]);printf("\n");}elseTry(i-j,s+1);     //尚未走到楼下,再试剩下的台阶(递归调用) }}}int main(){int h;while(scanf("%d",&h)!=EOF){count=0;Try(h,1);printf("count=%d\n",count); }return 0;}
法二:

#include <stdio.h>int Try(int h){if(h==1)return 1;else if(h==2)return 2;else if(h==3)return 4;elsereturn Try(h-1)+Try(h-2)+Try(h-3);}int main(){int h;while(scanf("%d",&h)!=EOF)printf("count=%d\n",Try(h));return 0;}
程序截图:


3. 分书问题

        有编号为0~4的5本书,准备分给5个人A,B,C,D,E。每个人的阅读兴趣用一个二维数组描述,公式如下:

        like[i][j]=1:i喜欢j书 ; 0:i不喜欢j书

        写一程序,输出所有分书方案,让人人皆大欢喜。假定5个人对5本书的阅读兴趣如下:

                                 0       1        2        3        4

                        A      0       0        1        1        0

                        B      1       1        0        0        1

                        C      0       1        1        0        1

                        D      0       0        0        1        0

                        E      0       1        0         0        1       

源代码:

#include <stdio.h>int take[5],n=0;int like[5][5]={{0,0,1,1,0},{1,1,0,0,1},{0,1,1,0,1},{0,0,0,1,0},{0,1,0,0,1}};int book[5]={0};void Try(int i){int j,k;for(j=0;j<5;j++)                       //j-书号 {if((like[i][j]) && (book[j]==0))   //满足分书条件时 {take[i]=j;                     //把j号书给i book[j]=1;                     //记录j号书已分 if(i==4)                       //i=4说明所有书均已被分完,输出方案 {n++;printf("第%d个方案:\n",n);for(k=0;k<5;k++)printf("%d号书分给%c ",take[k],k+'A');printf("\n");}else                           //否则书还没有分完,继续给下一人分书 Try(i+1);book[j]=0;                     //记录j书待分 }}}int main(){n=0;Try(n);                                //分书方案号预置0,开始分书过程 return 0;}
程序截图:


0 0
原创粉丝点击