递归算法

1. 百元百鸡问题。每只母鸡3元,每只公鸡4元,每只小鸡0.5元,如果花100元钱买100只鸡,请问有哪些可能?试编程输出所有的组合。【注:每种鸡的数量都可以为零】

源代码:

#include<stdio.h>

int main()

{

  int hen,rooster;

  printf("购买有以下这些组合:\n");

  for(hen=0;hen<=33;hen++)

  {

       for(rooster=0;rooster<=25;rooster++)

      {

          if(hen*3+rooster*4+0.5*(100-hen-rooster)==100)

             {

                 printf("母鸡:%d\t公鸡:%d\t小鸡:%d\t\n",hen,rooster,100-hen-rooster);

             }

      }

  }

  return 0;

}

      


 

2. 使用递归编写一个程序,求以下数列的前n项之和:

源代码:

#include<stdio.h>

#include<math.h>

double sum(int n)

{

    if(n==1) return 1;

    else return sum(n-1)-pow(-1,n)*(1.0/n);

}

int main()

{

  int x;

  printf("请输入数列的项数:\n");

  scanf("%d",&x);

  double y=sum(x);

  printf("数列前%d项和为:\n%.3lf",x,y);

  return 0;

}

当n=10时,结果为  0.646         。

当n=15时,结果为  0.725      。


 

3. 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。

其中,蜂房的结构如下所示。

       输入整数a和b表示起点和终点,输出a到b可能的线路数。例如:输入1和2,输出1;输入3和6,输出3。

提示:寻找规律,使用递归实现。

源代码:

#include<stdio.h>

#include<math.h>

int route(int n){

    if(n<=1) return 1;

    else return route(n-1)+route(n-2);

}

int main()

{

    int x,a,b,t;//x表示输入的数据组数

    printf("请输入数据的组数:\n");

    scanf("%d",&x);

    while(x--)

    {

        printf("请输入起点和终点:\n");

        scanf("%d%d",&a,&b);

        t=abs(a-b);

        printf("%d到%d可能的线路数为:%d\n",a,b,route(t));

    }

    return 0;

}

 

 

 


 

4. 编写一个程序,使用递归算法输出一个一维字符数组中所有字符的全排列,假设字符都不一样。例如{'a','b','c'}的全排列为(a,b,c), (a,c,b),(b,a,c), (b,c,a), (c,a,b), (c,b,a)。

源代码:

#include<stdio.h>

void swap(char list[],int k,int i)

{

    char t;

    t=list[k],list[k]=list[i],list[i]=t;

}

void perm(char list[],int k,int m)

{

    int i;

    if(k==m){//只剩下一个元素

            for(i=0;i<=m;i++){

                printf("%c",list[i]);

            }

            printf("\n");

    }

    else

        //还有多个元素,递归产生全排列

    for(i=k;i<=m;i++){

        swap(list,k,i);

        perm(list,k+1,m);

        swap(list,k,i);

    }

}

int main()

{

  char list[]={'a','b','c'};

  printf("此字符串的全排列为:\n");

  perm(list,0,3);

  return 0;

}

 


5. 九数组分数。1, 2, 3...9 这九个数字组成一个分数,其值恰好为1/3,如何组合?编写程序输出所有的组合。

源代码:

#include<stdio.h>

void test(int list[])

{

    int a = list[0]*1000 + list[1]*100 + list[2]*10 + list[3];

    int b = list[4]*10000 + list[5]*1000 + list[6]*100 + list[7]*10 + list[8];

    if(a*3==b) printf("%d / %d\n", a, b);

}

void swap(int list[],int k,int i)

{

    int t;

    t=list[k],list[k]=list[i],list[i]=t;

}

void perm(int list[],int k,int m)

{

    int i;

    if(k==m){//只剩下一个元素

            test(list);

            return;

    }

    else

    //还有多个元素,递归产生全排列

    for(i=k;i<=m;i++){

        swap(list,k,i);

        perm(list,k+1,m);

        swap(list,k,i);

    }

}

int main()

{

  int list[]={1,2,3,4,5,6,7,8,9};

  printf("分数组合为:\n");

  perm(list,0,9);

  return 0;

}

 


 

6. 使用递归编写一个程序,逆序输出一个正整数。例如输入1234,输出4321。

源代码:

#include<stdio.h>

void reverseSort(int x)

{

    if(x>0){

       printf("%d",x%10);

       reverseSort(x/10);

    }

}

int main()

{

    int num;

    printf("请输入一个整数:\n");

    scanf("%d",&num);

    printf("逆序输出结果为:\n");

    reverseSort(num);

    return 0;

}

 


 

7. 使用递归编写一个程序,计算一个正整数中所有数字之和。例如输入234,输出9。

源代码:

#include<stdio.h>

int sum(int x)

{

    int r;

    r=x%10;

    if(x>0){

           return r+sum(x/10);

    }

}

int main()

{

    int num;

    printf("请输入一个整数:\n");

    scanf("%d",&num);

    printf("此正整数中所有数字之和为:\n");

    printf("%d",sum(num));

    return 0;

}

 


 

8. 使用递归编写一个程序,求一个正整数n的所有划分个数。例如,输入3,输出3;输入4,输出5。

源代码:

#include<stdio.h>

int partition(int n,int m)

{

    if((n<1)||(m<1)) return 0;

    if((n==1)||(m==1)) return 1;

    if(n<m) return partition(n,n);

    if(n==m) return partition(n,m-1)+1;

    return partition(n,m-1)+partition(n-m,m);

}

int main()

{

    int num,result;

    printf("请输入一个整数:\n");

    scanf("%d",&num);

    result=partition(num,num);

    printf("此整数划分的个数为:\n");

    printf("%d",result);

    return 0;

}

      


 

9. 用大小为1×2的骨牌铺满一个大小为2×n的长方形方格,编写一个程序,输入n,输出铺放方案总数。例如,输入n=3,即大小为2×3的方格,输出3。3种骨牌铺放方案如下图所示:【只需要输出铺放方案总数,不需要输出具体的铺放方案】

源代码:

#include<stdio.h>

int pave(int n)

{

    if(n<=1) return 1;

    else return pave(n-1)+pave(n-2);

}

int main()

{

    int x;

    printf("请输入要铺的长方形的长度:\n");

    scanf("%d",&x);

    printf("输出铺放方案总数:\n");

    printf("%d",pave(x));

    return 0;

}

 


 

       10. 编写一个递归函数,返回一个字符串中大写字母的数目。例如,输入“AbcD”,输出2。

源代码:

#include <stdio.h>

#define N 200

int count(char *ch)

{

  int total=1;

  if(*ch=='\0')

  return 0;

  else

  {

   if(*ch>='A'&&*ch<='Z')

   return total+count(ch+1);

   else return count(ch+1);

}

}

int main()

{

    char *ch;

    ch=malloc(N+1);

    printf("请输入输入一行字符:\n");

    gets(ch);

    printf("此字符串中大写字母有%d个\n",count(ch));

    getchar();

}

 


 

11. 使用递归编写一个程序实现汉诺塔问题,要求在输入圆盘数量之后,输出圆盘的移动步骤,输出格式示例如下:

第1步:1号盘从A柱移至B柱

第2步:2号盘从A柱移至C柱

……

源代码:

#include<stdio.h>

int i=1;

void move(int num,char x,char y)

{

    printf("第%d步:%d号盘从%c柱移至%c柱\n", i++,num,x,y);

}

void hanoi(int n,char a,char b,char c)

{

    if(n==1)

    move(1,a,c);

    else

    {

        hanoi(n-1,a,c,b);

        move(n,a,c);

        hanoi(n-1,b,a,c);

    }

}

 

int main()

{

    int num;

    char p,q,h;

    p='A',q='B',h='C';

    printf("请输入圆盘数量:\n");

    scanf("%d",&num);

    printf("圆盘的移动步骤为:\n");

    hanoi(num,p,q,h);

    return 0;

}

当圆盘数量为4时,详细移动步骤为:

圆盘的移动步骤为:

第1步:1号盘从A柱移至B柱

第2步:2号盘从A柱移至C柱

第3步:1号盘从B柱移至C柱

第4步:3号盘从A柱移至B柱

第5步:1号盘从C柱移至A柱

第6步:2号盘从C柱移至B柱

第7步:1号盘从A柱移至B柱

第8步:4号盘从A柱移至C柱

第9步:1号盘从B柱移至C柱

第10步:2号盘从B柱移至A柱

第11步:1号盘从C柱移至A柱

第12步:3号盘从B柱移至C柱

第13步:1号盘从A柱移至B柱

第14步:2号盘从A柱移至C柱

第15步:1号盘从B柱移至C柱

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值