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