第二章 递归

来源:互联网 发布:大麦户源码安装教程 编辑:程序博客网 时间:2024/06/05 09:59

Ackerman函数

#include<iostream>#include<cstdio>int n,m;using namespace std;int f(int n,int m){    if(n==1&&m==0)        return 2;    else if(n==0&&m>=0)        return 1;    else if(n>=2&&m==0)        return n+2;    else if(n>=1&&m>=1)        return f(f(n-1,m),m-1);}int main(){    while(cin>>n>>m)        {            cout<<f(n,m)<<endl;        }}

当m=1时,A(n,1)是函数乘2

当m=2时,A(n,2)是函数2的n次方

当M=3时,A(n,3)是2的2的2的2的。。。次方,其中2的层数为n



全排列问题


#include<iostream>#include<cstdio>int n,m;using namespace std;template <class Type>inline void Swap(Type &a,Type &b){    Type temp=a;a=b;b=temp;}template <class Type>void prem(Type list[],int k,int m){    //产生list[k:m]的所有排列    if(k==m)    {        //只剩下一个元素        for(int i=1;i<=m;++i)            cout<<list[i];        cout<<endl;    }    else        for(int i=k;i<=m;++i)    {        Swap(list[k],list[i]);        prem(list,k+1,m);        Swap(list[k],list[i]);    }}int main(){    int n;    cin>>n;    int a[n];    for(int i=1;i<=n;++i)        cin>>a[i];    prem(a,1,5);}

整数划分问题

例如,正整数6有如下11中不同的划分

6:

5+1

4+2,  4+1+1

3+3, 3+2+1, 3+1+1+1

2+2+2, 2+2+1+1,  2+1+1+1+1

1+1+1+1+1+1

#include<iostream>#include<cstdio>int n,m;using namespace std;int q(int n,int m){    if(n<1||m<1)        return 0;    if(n==1||m==1)        return 1;    if(n<m)        return q(n,n);    if(n==m)        return q(n,m-1)+1;    return q(n,m-1)+q(n-m,m);//n>m>1}int main(){    while(cin>>n>>m&&n)    {        cout<<q(n,m)<<endl;    }}


整数划分问题

#include<iostream>#include<cstdio>#include<cmath>using namespace std;int solve(int n,int m){    if(m<1||n<1)        return 0;    if(n<m)        return solve(n,n);    if(n==1||m==1)        return 1;    if(n==m)        return 1+solve(n,n-1);    if(n>m&&m>1)        return solve(n,m-1)+solve(n-m,m);}int main(){    int n,m;    while(cin>>n>>m)    {        cout<<solve(n,m)<<endl;;    }}



Hanoi问题

#include<iostream>#include<cstdio>#include<cmath>using namespace std;void Move(int n,char a,char b){    cout<<n<<" from "<<a<<" to "<<b<<endl;}void Hanoi(char a,char b,char c,int n){    if(n>0)    {        Hanoi(a,c,b,n-1);        Move(n,a,b);        Hanoi(c,b,a,n-1);    }}int main(){    int n;    while(cin>>n)    {        Hanoi('a','b','c',n);    }}

要求把N个盘子从A借助C移到B,思路是先把上面的N-1个盘子通过B移到C上,然后把下面最大的盘子移到B上,再把上面的N-1个盘子移到B上。












0 0
原创粉丝点击