OJ《程序设计基础II》实验4——递归

28 篇文章 2 订阅
17 篇文章 1 订阅

4-1 A - 计算组合数

#include <stdio.h>
int f(int n,int m)
{
	int y;
	if(m==0) y=1;
	else if(n==1) y=1;
	else if(m==n) y=1;
	else y=f(n-1,m-1)+f(n-1,m);
	return y;
}
int main()
{
	int t,n,m,y;
	scanf("%d",&t);
	while(t>0)
	{
		scanf("%d %d",&n,&m);
		y=f(n,m);
		printf("%d\n",y);
		t--;
	}
	return 0;
}//递归就是写函数,差不多意思

4-2 B - 神奇的函数

#include <stdio.h>
int f(int n,int m)
{
	int y;
	if(m==1||n==1) y=1;
	else y=f(n-1,m)+f(n,m-1);
	return y;
}
int main()
{
	int t,n,m,y;
	scanf("%d",&t);
	while(t>0)
	{
		scanf("%d %d",&n,&m);
		y=f(n,m);
		printf("%d\n",y);
		t--;
	}
	return 0;
}

4-3 C - 喵帕斯之天才算数少女

#include <stdio.h>
int f(int m,int n)
{
	int y;
	if(m==0) y=n+1;
	if(m>0&&n==0) y=f(m-1,1);
	if(m>0&&n>0) y=f(m-1,f(m,n-1));
	return y;
}
int main()
{
	int t,n,m,y;
	scanf("%d",&t);
	while(t>0)
	{
		scanf("%d %d",&m,&n);
		printf("%d\n",f(m,n));
		t--;
	}
	return 0;
}

4-4 D - 汉诺塔

#include <stdio.h>
void moves(int n,char a,char b)
{
    printf("Move disk %d from %c to %c\n",n,a, b);
}
void hanoi(int n,char o, char t, char d)
{
    if(n==1)
        moves(n,o,d);
    else
    {
        hanoi(n-1,o,d,t);
        moves(n,o,d);
        hanoi(n-1,t,o,d);
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    hanoi(n,'A','B','C');
    return 0;
}//逻辑问题,想象一下就很好解决

4-5 E - 青蛙过河

#include <stdio.h>
int f(int s,int y)
{
    if(s==0)
        return y+1;
    else
        return 2*f(s-1,y);
}
int main()
{
    int s,y,t,i;
    scanf("%d",&t);
    for(i=0; i<t; i++)
    {
        scanf("%d %d",&s,&y);
        printf("%d\n",f(s,y));
    }
    return 0;
}

4-6 F - 数据结构实验之排序八:快速排序

#include<stdio.h>
void f(int a[],int left,int right)
{
   int x=a[left],i=left,j=right;
   if(i>=j) return;
   while(i<j)
   {
     while(i<j&&a[j]>=x) j--;
     a[i]=a[j];
     while(i<j&&a[i]<=x) i++;
     a[j]=a[i];//这边有个好记的方法,j--在前,i++在后,顺序不能变
   }
   a[i]=x;
   f(a,left,i-1);
   f(a,i+1,right);//上面的快排一次后,继续重新定义x重复快排
}//快速排序法
int main()
{
  int n,a[100010],i;
  while(~scanf("%d",&n))
  {
    for (i=0;i<n;i++)
    {
       scanf("%d",&a[i]);
    }
    f(a,0,n-1);
    for (i=0;i<n;i++)
    {
      if(i==n-1)
        printf("%d\n",a[i]);
      else
        printf("%d ",a[i]);
    }
  }
  return 0;
}

4-7 G - 第X大的数

#include <stdio.h>
void sqort(int a[],int l,int r)//顺序快排
{
    int key=a[l];
    int i=l,j=r;
    if(l>=r)
        return ;
    while(i<j)
    {
        while(i<j&&a[j]<=key)j--;
        a[i]=a[j];
        while(i<j&&a[i]>=key)i++;
        a[j]=a[i];
    }
    a[i]=key;
    sqort(a,l,i-1);
    sqort(a,i+1,r);
}
int main()
{
    int n,i;
    int a[100110];
    int m,x;
    while(~scanf("%d",&n))
    {
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        scanf("%d",&m);
        sqort(a,0,n-1);
        for(i=0;i<m;i++)
        {
            scanf("%d",&x);
            printf("%d\n",a[x-1]);
        }//找数
    }
    return 0;
}

4-8 H - M--二分查找

#include <stdio.h>
int a[3000010];
int f(int a[],int l,int r,int x)
{
    int m;
    if(l<=r)
    {
        m=(l+r)/2;//取中间值为固定点
        if(a[m]==x)
            return m;
        if(a[m]>x)
            return f(a,l,m-1,x);
        else
            return f(a,m+1,r,x);
    }//不断二分查找
    return -1;
}
int main()
{
    int n,i,x,q;
    scanf("%d",&n);
    for(i=1; i<=n; i++)
    {
        scanf("%d",&a[i]);
    }
    scanf("%d",&q);
    for(i=1; i<=q; i++)
    {
        scanf("%d",&x);
        printf("%d\n",f(a,1,n,x));
    }
    return 0;
}

4-9 I - 第k小的数

#include <stdio.h>
int a[900110];
void sqort(int a[],int l,int r)
{
    int key=a[l];
    int i=l,j=r;
    if(l>=r)
        return ;
    while(i<j)
    {
        while(i<j&&a[j]>=key)j--;
        a[i]=a[j];
        while(i<j&&a[i]<=key)i++;
        a[j]=a[i];
    }
    a[i]=key;
    sqort(a,l,i-1);
    sqort(a,i+1,r);
}//还是快排
int main()
{
    int n,k,i;
    scanf("%d %d",&n,&k);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    sqort(a,0,n-1);
    printf("%d",a[k-1]);
    return 0;
}

4-10 J - 全排列问题

#include <stdio.h>
void swap(int *q,int *p)
{
    int t;
    t = *q; 
    *q = *p;
    *p = t;
}
void circular_right(int a[],int left,int right)
{
    int tmp,i;
    if(left>=right)
        return;
    tmp=a[right];
    for(i=right;i>left;i--)
        a[i]=a[i-1];
    a[left]=tmp;
}
void circular_left(int a[],int left,int right)
{
    int tmp,i;
    if(left>=right)
        return;
    tmp=a[left];
    for(i=left;i<right;i++)
        a[i]=a[i+1];
    a[right]=tmp;
}
void f(int a[],int k,int m)
{
    int i;
    if(k==m)
    {
        for(i=0; i<=m; i++)
        {
            if(i==0)
                printf("%d",a[i]);
            else printf(",%d",a[i]);
        }
        printf("\n");
    }
    else
    {
        for(i=k; i<=m; i++)
        {
            swap(&a[k],&a[i]);
            circular_right(a,k+1,i);
            f(a,k+1,m);
            circular_left(a,k+1,i);
            swap(&a[k],&a[i]);
        }
 
    }
}
int main ()
{
 
    int array[11],i,t,n;
 
            scanf("%d",&n);
            for(i=0; i<n; i++)
            {
                scanf("%d",&array[i]);
            }
            f(array,0,n-1);
 
    return 0;
 
}

加油加油加油!!!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CRAEN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值