递归练习(二)

题目 1:

数的组合问题。从1,2,…,n中取出m个数,将所有组合按照字典顺序列出。如n=3,m=2时,输出:12 13 23

#include <stdio.h>
int Function(int n,int m,int a[],int depth,int output[],int size,int x) //n即指有n个数,m为从n个数中选取的个数,a[]为所选取的数组,depth递归进入深度,output答案,size为大小,x为当前扫描到的位置 
{
    if(m == 0)
    {
        int i;
        for(i = 0;i < size;i++)
        {
            printf("%d ",output[i]);
        }
        printf("\n");
        return 1;
    }else
    {
        int i;
        for(i = x;i <= n - m;i++)
        {
            output[depth] = a[i];
            Function(n,m - 1,a,depth + 1,output,size,i + 1);
        }
    }
}
int main ()
{
    int output[2];
    int a[5] = {1,2,3,4,5};
    Function(5,2,a,0,output,2,0);
    return 0;
}

题目 2:

小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现只剩下一个桃子了问第一天猴子共摘多少个桃子?

#include <stdio.h>
int Peachcount(int day)
{
    if(day == 10)
    return 1;
    return (Peachcount(day + 1)+1) * 2;
}
int main () 
{
    int day = 1;
    printf("第一天的桃子个数:%d\n",Peachcount(1));
    return 0;
}

题目3:

有雌雄一对兔子,假定过两个月便可每个月繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子?

#include <stdio.h>
int Rabbitcount(int month)
{
    if(month == 0 || month == 1)
    return 1;
    return Rabbitcount(month - 1) + Rabbitcount(month - 2);
} 
int main ()
{
    int month;
    printf("请输入过了多少个月:\n");
    scanf("%d",&month);
    printf("兔子的一共的对数:%d",Rabbitcount(month));
    return 0;
}

题目4:

一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?

#include <stdio.h>
int Duckcount(int village)
{
    if(village == 7)
    return 2;
//    return Duckcount(village - 1) / 2 - 1;
    return (Duckcount(village + 1) + 1) * 2;
}
int main ()
{
    int village;
    printf("请输入经过的村庄个数:\n");
    scanf("%d",&village);
    int i;
    for(i = village;i >= 0;i--)
    {
        printf("经过第%d个村庄鸭子数:%d\n",i,Duckcount(i));
    }
    return 0;
}

题目5:

著名的菲波拉契(Fibonacci)数列,其第一项为0,第二项为1,从第三项开始,其每一项都是前两项的和。编程求出该数列前N项数据。

#include <stdio.h>
int Fib(int n)
{
    if(n == 0
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值