ACM选修课3 递归

递归算法

定义:自己调用自己(需要调用栈来执行)
两个基本要素:边界条件(何时结束)和 递归模式(大问题如何转化为小问题)
关键:根据递推关系式写程序(用数学归纳法证明)
注意:递归算法在数据量特别大的时候会出现段错误(例如:递归运算100000000!时)

例题

计算N!(简单版)

#include <bits/stdc++.h>
using namespace std;
long long int fun(long long int n);
int main()
{
    long long int n;
    while(cin>>n)
        cout<<fun(n)<<endl;
    return 0;
}
long long int fun(long long int n)
{
    long long int k;
    if(n==0||n==1)
        k=1;
    else
        k=fun(n-1)*n;
    return k;
}
/*
阶乘函数的另一种写法
long long int fun(long long int n)
{
	return n==0?1:f(n-1)*n;
}
*/

Fibonacci Again

#include <bits/stdc++.h>
using namespace std;
int fib(int n);
int main()
{
    int n;
    while(cin>>n)
    {
        n=n%8;//找到循环节
        if(fib(n)==0)
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
    return 0;
}
int fib(int n)//递归法计算
{
    if(n==0)
        return 1;
    else if(n==1)
        return 2;
    else
        return (fib(n-1)+fib(n-2))%3;
}

蟠桃记

#include <bits/stdc++.h>
using namespace std;
int fun(int n);
int main()
{
    int n;
    while(cin>>n)
    {
        if(n==0)
            break;
        int ans=fun(n);
        cout<<ans<<endl;
    }
    return 0;
}
int fun(int n)
{
    if(n==1)
        return 1;
    else
        return 2*(fun(n-1)+1);//用递归实现
}

幂次方-递归

#include <bits/stdc++.h>
using namespace std;
int a[100];
int dfs(int n);
int main()
{
    int n;
    a[0]=1;
    for(int i=1; i<=30; i++)
        a[i]=a[i-1]*2;
    cin>>n;
    dfs(n);
    return 0;
}
int dfs(int n)
{
    int k;
    while(n)
    {
        for(int i=1; i<=30; i++)
            if (a[i]>n)
            {
                k=i-1;
                break;
            }
        n-=a[k];
        if (k==0&&n>0)
            cout<<"2(0)+";
        if (k==0&&n==0)
            cout<<"2(0)";
        if (k==1&&n>0)
            cout<<"2+";
        if (k==1&&n==0)
            cout<<"2";
        if (k==2&&n>0)
            cout<<"2(2)+";
        if (k==2&&n==0)
            cout<<"2(2)";
        if (k>2)
        {
            cout<<"2(";
            dfs(k);
            if (n>0)
                cout<<")+";
            else
                cout<<")";
        }
    }
    return 0;
}

数的计算-递归

#include <bits/stdc++.h>
using namespace std;
int num=0;
int dfs(int n)
{
    for(int i=1; i<=n/2; i++)
    {
        num++;
        dfs(i);
    }
    return 0;
}
int main()
{
    int n;
    cin>>n;
    dfs(n);
    cout<<num+1<<endl;
    return 0;
}

数的计算加强版-递推

#include <bits/stdc++.h>
using namespace std;
long long a[10001];
int main()
{
    int n;
    cin>>n;
    a[0]=a[1]=1;
    for(int i=1; i<=n; i++)
    {
        if (i&1)
            a[i]=a[i-1];
        else
            a[i]=a[i-1]+a[i/2];
    }
    cout<<a[n]<<endl;
    return 0;
}

数字分段-递归

#include <bits/stdc++.h>
using namespace std;
int a[100];
int n,k;
int dfs(int r,int l)
{
    int s=0;
    for(int i=r; i>=l; i--)
    {
        s+=a[i];
        if (s>k)
        {
            dfs(i,l);
            cout<<i+1<<" "<<r<<endl;
            return 0;
        }
    }
    cout<<1<<" "<<r<<endl;
}
int main()
{
    cin>>n>>k;
    for(int i=1; i<=n; i++)
        cin>>a[i];
    dfs(n,1);
    return 0;
}

白与黑

#include <bits/stdc++.h>
using namespace std;
int w,h; //定义公有变量 长和宽
char z[21][21];
int f(int i,int j);
int main()
{
    while(cin>>w>>h)
    {
        if (w==0&&h==0)
            break;
        for(int i=1; i<=h; i++)
            for(int j=1; j<=w; j++)
                cin>>z[i][j];
        for(int i=1; i<=h; i++)
            for(int j=1; j<=w; j++)
                if (z[i][j]=='@')
                    cout<<f(i,j)<<endl;
    }
    return 0;
}
int f(int i,int j)
{
    if (i<1||i>h||j<1||j>w) //处理边界
        return 0;
    if (z[i][j]!='#')
    {
        z[i][j]='#';
        return 1+f(i,j-1)+f(i,j+1)+f(i-1,j)+f(i+1,j);
    }
    else
        return 0;
}

数字分段-递归

#include <bits/stdc++.h>
using namespace std;
int a[100];
int n,k;
int dfs(int r,int l)
{
    int s=0;
    for(int i=r; i>=l; i--)
    {
        s+=a[i];
        if (s>k)
        {
            dfs(i,l);
            cout<<i+1<<" "<<r<<endl;
            return 0;
        }
    }
    cout<<1<<" "<<r<<endl;//这句处理第一段!
}
int main()
{
    cin>>n>>k;
    for(int i=1; i<=n; i++)
        cin>>a[i];
    dfs(n,1);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46126537/article/details/105372566