递归的例子

目录

例1:阶乘函数

例2:Fibonacci数列

例3:Ackerman函数

例4:全排列

例5:hanoi塔问题


例1:阶乘函数

#include<iostream>
using namespace std;
int f(int n)
{
    if(n==0)
        return 1;
    else
        return f(n-1)*n;
}
int main()
{
    int n;cin>>n;
    cout<<f(n);
    return 0;
}

例2:Fibonacci数列

无穷数列1,1,2,3,5,8,13.....被称为Fibonacci数列

#include<iostream>
using namespace std;
int f(int n)
{
    if(n==0||n==1)
        return 1;
    else
        return f(n-1)+f(n-2);
}
int main()
{
    int n;cin>>n;
    cout<<f(n-1);//求斐波那契数列的第n个数
    return 0;
}

例3:Ackerman函数

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

例4:全排列

假设将0,1,2进行全排列:

先将0与第一位元素交换, 对后面两个元素进行全排列(递归)后,再将0与第一位元素交换回原位置;将1与第一位元素交换, 对后面两个元素进行全排列(递归),再将1与第一位元素交换回原位置;重复此步骤直到最后一个元素。

#include<iostream>
using namespace std;
void Swap(int a[],int i,int j)
{
    int t=a[i];
    a[i]=a[j];
    a[j]=t;
}
void Printarray(int a[],int n)
{
    for(int i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}
void Perm(int a[],int p,int q)
{
    if(p==q)
    {
        Printarray(a,q+1);
    }
    else
    {
        for(int i=p; i<=q; i++)
        {
            Swap(a,p,i);
            Perm(a,p+1,q);
            Swap(a,p,i);
        }
    }
}
int main()
{
    int a[]={0,1,2};
    Perm(a,0,2);
    return 0;
}

例5:hanoi塔问题

1.将n-1个盘子由x杆经由z杆移动到y杆,此时x杆上仅剩下第n个盘子,y杆上有n-1个盘子,z杆上无盘子;

2.将x杆上的第n个盘子移动到z杆上;

3.再将y杆上的盘子经由x杆移动到z杆上。

#include<iostream>
using namespace std;
void Move(char c1,char c2)
{
    printf("%c->%c\n",c1,c2);
}
void Hanoi(int n,char x,char y,char z)
{
    if(n==1)
        Move(x,z);
    else
    {
        Hanoi(n-1,x,z,y);//将x杆上n-1个盘子经由z杆移动到y杆;
        Move(x,z);//将在x杆上的第n个盘子移动到z杆;
        Hanoi(n-1,y,x,z);//将在y杆上的n-1个盘子经由x杆移动到z杆;
    }
}
int main()
{
    int n;cin>>n;//盘子个数n
    Hanoi(n,'x','y','z');
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值