第二章 递归

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上。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值