算法-递归

例子1 全排列 n!

#include <iostream>
using namespace std;
void swap(int& a,int& b){
    int r=a;
    a = b;
    b=r;
}
//将数组 第begin个数到第end个数之间的数进行全排列输出 
void permutation(int* list,int begin, int end){
    if(begin==end){  //第end个数已经排好 可以输出了 
        for(int i=0;i<end;i++){
            cout<<list[i]<<",";
        }
        cout<<endl;
        return;
    }
    for(int i=begin;i<end;i++){
        swap(list[begin],list[i]);
        permutation(list,begin+1,end);
        swap(list[i],list[begin]);  //恢复数组原样 
    }
}

int main(){
    int n;
    int list[10]={1,2,3,4,5,6,7,8,9,0};
    cin>>n;
    permutation(list,0,n);
    for(int i=0;i<10;i++){
        cout<<list[i]<<" ";
    }
}

例子2:逆波兰表达式

#include <iostream>
using namespace std;

//逆波兰表达式 
double exp(){
    char r[10];
    scanf("%s",r);  //遇空格断开 
    switch(r[0]){
        case '+': return exp() + exp();
        case '-': return exp() - exp();
        case '*': return exp() * exp();
        case '/': return exp() / exp();
        default: return atof(r);
    }
}


int main(){
double ans;
ans = exp();
cout<<ans;
}
#include <iostream>
using namespace std;

//逆波兰表达式 转化为普通表达式 
void exp(){
    char r[10];
    scanf("%s",r);  //遇空格断开 
    switch(r[0]){
        case '+': cout<<"(";exp();cout<<"+";exp();cout<<")"; break;
        case '-': cout<<"(";exp();cout<<"-";exp();cout<<")"; break;
        case '*': cout<<"(";exp();cout<<"*";exp();cout<<")";break;
        case '/': cout<<"(";exp();cout<<"/";exp();cout<<")";break;
        default: cout<<r;
    }
}


int main(){
exp();
}

例子3 普通表达式的计算

#include <iostream>
using namespace std;
//表达式的常规计算
//基本思想 : 表达式由项组成(以+或-连接起来的不同部分) 
//项由因子组成(以*或/连接起来的不同部分)
//因子又是由数字或表达式组成的,表达式由括号扩着 
//数字和数字之间可以直接计算

double expValue();
double factorValue(){
    //读入并计算一个因子的值
    double v;
    char c = cin.peek();
    if(c=='('){  //在括号里面说明是表达式 
        cin.get();
        v = expValue(); 
        cin.get();
    }
    else{
        cin>>v;
    }
    return v;
}

double itemValue(){
    //读入并计算项的值
    double v=factorValue();
    while(1){  
        char c=cin.peek();
        if(c=='/'){
            cin.get();
            v /= factorValue();
        }
        else if(c=='*'){
            cin.get();
            v *= factorValue();
        }
        else{
            break;
        }
    } 
    return v;
}

double expValue(){
    //计算表达式的值
    double v=itemValue();
    while(1){  //重复提取计算符号和表达式 
        char c= cin.peek();
        if(c=='+'){
            cin.get();
            v += itemValue();
        }
        else if(c=='-'){
            cin.get();
            v -= itemValue();
        }
        else{
            break;
        }
    } 
    return v;
} 

int main(){
    cout<<expValue()<<endl;
}

例子4:分割棋盘

#include <iostream>
#include <cmath>
#include <cstring>
#include <iomanip>
using namespace std;

//棋盘分割  每个棋格都代表一个数
//用一刀切法 切割指定次数 分割给定的正方形棋盘 ,分成的矩形小棋盘的值是其所有格子之和
//求使得各矩形小棋盘总分的均方差最小值
//分析问题 大棋盘是给定的,n也是给定的 所以无论怎么分 分成的矩形小棋盘总分的均值总是相同的
//各矩形小棋盘只由 各个小棋盘的总分平方和决定
//因此问题转化为 求将一个给定的棋盘分成指定个矩形,矩形的总分的平方和最小为多少。

//给每个格子(x,y)坐标
int sum[9][9];//sum(i,j)是棋盘(1,1)到(i,j)的总分
int result[16][9][9][9][9];//result(n,x1,y1,x2,y2)是将(x1,y1)和(x2,y2)构成的矩形分成n块,的最小值
int smallsum(int x1,int y1,int x2,int y2){  //(x1,y1)到(x2,y2)的总分
    return sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
}

int fun(int n,int x1,int y1,int x2,int y2){
    //以(x1,y1)为左定点,(x2,y2)为右定点的矩形,分成n个矩形后 最小的平方和
    //中止条件 横向最多切 x2-x1 , 纵向最多y2-y1, 必须切n-1,所以x2-x1+y2-y1>=n-1
    int v = 1<<30;
        if(n==1){
        int t=smallsum(x1,y1,x2,y2);
        return t*t;
        }

    if(x2-x1+y2-y1<n-1){
        return v;
    }
        if(result[n][x1][y1][x2][y2]!=-1){
         return result[n][x1][y1][x2][y2];
  }
         

    //对 x1-x2之间所有能切的的切法进行遍历
    for(int x=x1;x<x2;x++){
        int left=smallsum(x1,y1,x,y2);
        int right=smallsum(x+1,y1,x2,y2);
        int t=min(fun(n-1,x+1,y1,x2,y2)+left*left,fun(n-1,x1,y1,x,y2)+right*right);
        v = min(v,t);
    }
    //对y1-y2之间所有能切的切法进行遍历
    for(int y=y1;y<y2;y++){
        int up=smallsum(x1,y1,x2,y);
        int down=smallsum(x1,y+1,x2,y2);
        int t=min(fun(n-1,x1,y1,x2,y)+down*down,fun(n-1,x1,y+1,x2,y2));
        v = min(v,t);
    }
    result[n][x1][y1][x2][y2] = v;
    return v;
}
 
int main(){
    int n;
    memset(sum,0,sizeof(sum));//置0
    memset(result,0xff,sizeof(result));//置-1
    cin>>n;
    for(int i=1;i<=8;i++){
        int rowsum = 0;
            for(int j=1;j<=8;j++){
                int s;
                cin>>s;
                rowsum +=s;
                sum[i][j]=sum[i-1][j]+rowsum; //上一行以上的矩形+ 本行的矩形
            }
       
    }
    //输出均方差
     int squareSum = fun(n,1,1,8,8);
     double result = n*squareSum - sum[8][8]*sum[8][8];
     cout<<setiosflags(ios::fixed) << setprecision(3) <<sqrt(result/(n*n));
}

例5.放苹果问题

#include <iostream>
#include <cmath>
#include <cstring>
#include <iomanip>
using namespace std;

//放苹果问题  将m个苹果放到n个盘子里,允许有的盘子空着不放 
int appway(int m,int n){
    if(m==0){
        return 1;
    }
    if(n==0){
        return 0;
    }
    if(n>m){
        return appway(m,m);
    }
    //下面处理盘子数目小于等于苹果数的情况
    return  appway(m,n-1)+appway(m-n,n);
}
int main(){
    int m,n;
    cin>>m>>n;
    cout<<appway(m,n);
}

 

转载于:https://www.cnblogs.com/Latticeeee/p/9068330.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值