Ackerman函数的递归、全排列的递归实现、整数划分的递归、二分搜索的递归、合并排序的递归、.快速排序

第一次单元章节考核

要求:

程序检查过后点“提交”按钮,然后关机,走人!

注意:

严格按照输入、输出的要求,否则一律0分,补考!!!

题目如下:

1. Ackerman函数的递归实现算法。

输入:输入两个数字,先输入n,后输入m。

输出:Ackerman函数计算后的值。

示例:输入:4    2,输出:16

 

Ackerman函数A(n,m)定义如下:

有两个独立的整型变量m、n:

#include<iostream>

using namespace std;

int Ackerman(int n,int m)

{if(m==0&&n==1) return2;

if(m>=0&&n==0) return1;

    if(m==0&&n>=2)return n+2;

    else if(m>=1&&n>=1) returnAckerman(Ackerman(n-1,m),m-1);

}

int main()

{

    int n,m;

    cout<<"输入:";

    cin>>n>>m;

    cout<<"输出:"<<Ackerman(n,m);

}


 

2.全排列的递归实现算法。

输入:先输入要求输入的字符的个数,后依次输入(或随机生成)每个字符(不能仅仅是数字)

输出:全排列的结果。

示例:输入:3  /  *  2,输出:/  * 2  /  2  *  *  /  2  *  2  /  2  *  /  2  /  * 

R的全排列可归纳递归定义如下:

#include<iostream>

using namespace std;

void Swap(char&a,char &b)

{

char t;

t=a;

a=b;

b=t;

}

void Perm(charlist[],int k,intm)

{

    if(k==m)

    {

    for(int i=0;i<=m;i++)cout<<list[i];

    cout<<endl;

    }

    else for(inti=k;i<=m;i++)

    {

    Swap(list[k],list[i]);

         Perm(list,k+1,m);

         Swap(list[k],list[i]);

    }

}

int main()

{char list[10000];

int n;

cout<<"输入:";

cin>>n;

for(inti=0;i<n;i++)

    cin>>list[i];

cout<<"输出:";

Perm(list,0,n-1);

return 0;

}


 

3.整数划分的递归实现算法。

输入:输入整数划分的整数(只输入一次,即n==m)。

输出:输入整数的划分个数值。

示例:输入:7,输出:15

 

q(n,m)的如下递归关系定义如下:

正整数n的划分数p(n)=q(n,n)。

#include<iostream>

using namespace std;

int q(int n,int m)

{

if((n<1)||(m<1)) return0;

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

if(n<m) returnq(n,n);

if(n==m) return1+q(n,n-1);

else  return q(n,m-1)+q(n-m,m);

}

int main()

{int n,m;

    cout<<"输入:";

    cin>>n;

    m=n;

    cout<<"输出:"<<q(n,m);

    return 0;

}


 

4.二分搜索的递归实现算法。

输入:先输入进行二分搜索元素的个数,然后按大小依次输入(或随机生成,然后排序)每个数字,最后输入要求搜索的元素。

输出:要求搜索元素的下标(下标从0开始!)。

示例:输入:61 5 5 9 6 9 6,输出3

#include<iostream>

using namespace std;

void Change(int a[],int n)

{

for(inti=1;i<n;i++)

    for(int j=1;j<n-i;j++)

    if(a[j]<a[j-1])

    {

         intq=a[j-1];

         a[j-1]=a[j];

         a[j]=q;

    }

}

int BinarySearch(inta[],int left,intright,int k)

{

    while(left<=right)

    {   int mid=(left+right)/2;

    if(k=a[mid])return mid;

    else if(k>a[mid]) BinarySearch(a,mid-1,right,k);

    else if(k<a[mid]) BinarySearch(a,left,mid-1,k);

    }

}

int main()

{int a[10000];

int n,k;

cout<<"输入:";

cin>>n;

for(inti=0;i<n;i++)

cin>>a[i];

cin>>k;

Change(a,n);

cout<<"输出:"<<BinarySearch(a,0,n-1,k);

}


 

5.合并排序的递归实现算法。

输入:先输入进行合并排序元素的个数,然后依次随机输入(或随机生成)每个数字

输出:元素排序后的结果,数字之间不加任何标识符。

示例:输入:8  11  1  2  4  8  6  15  8,输出:1  2  4  6  8  8  11  15

#include<iostream>

using namespace std;

void Merge(int c[],int d[],int l,int m,int r)

{

    inti=l,j=m+1,k=l; //全为L

    while((i<=m)&&(j<=r))

         if(c[i]<=c[j])

            d[k++]=c[i++];

         elsed[k++]=c[j++];

         if(i>m)

             for(int q=j;q<=r;q++)

                  d[k++]=c[q];

         else for(intq=i;q<=m;q++)

             d[k++]=c[q];

}

void Copy(int a[],int b[],int left,int right)

{

for(;left<=right;left++)a[left]=b[left];

}

void MergeSort(inta[],int left,intright)

{

int b[10000];

if(left<right)

{

int i=(left+right)/2;

MergeSort(a,left,i);

MergeSort(a,i+1,right);

Merge(a,b,left,i,right);

Copy(a,b,left,right);

}

}

int main()

{int a[10000];

int n;

cout<<"输入:";

cin>>n;

for(inti=0;i<n;i++)

    cin>>a[i];

MergeSort(a,0,n-1);

cout<<"输出:";

for(inti=0;i<n;i++)

cout<<a[i]<<" ";

return 0;

}


 

6.快速排序的递归实现算法。

输入:先输入进行合并排序元素的个数,然后依次随机输入(或随机生成)每个数字

输出:元素排序后的结果。

示例:输入:8  9  1  2  4  8  6  15  8,输出:1  2  4  6  8  8  9  15

#include<iostream>

using namespace std;

void Swap(int &a,int &b)

{

int t=a;

a=b;

b=t;

}

int Partition(inta[],int low,inthigh)

{

int p=a[low];

while(low<high)

{

while(a[high]>p)

    high--;

Swap(a[low],a[high]);

while(a[low]<=p)

    low++;

Swap(a[low],a[high]);

 

}

return low;

}

void QuickSort(inta[],int low ,inthigh)

{if(low<high){

int pr=Partition(a,low,high);

QuickSort(a,low,pr-1);

QuickSort(a,pr+1,high);}

}

 

int main()

{int a[10000];

int n;

cout<<"输入:";

cin>>n;

for(inti=0;i<n;i++)

    cin>>a[i];

QuickSort(a,0,n-1);

cout<<"输出:";

for(inti=0;i<n;i++)

cout<<a[i]<<" ";

return 0;

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值