首页 > 其他分享 >递归的几个例子

递归的几个例子

时间:2025-01-11 15:03:58浏览次数:3  
标签:pre 10 递归 几个 max int 例子 split res

递归

1 数字划分:求将数字分解为不同数字相加的种类

例如2=2 、2=1+1 两种 3=3, 3=2+1,3=1+1+1 三种

int split(int n, int max){
    if(n == 0 || max == 1)
        return 1;
    if(max > n)
        return split(n, n);
    return split(n-max, max) + split(n, max - 1);
}

将不同的种类都输出

#include "iostream"
#include "vector"
using namespace std;

int N;
void split(int n, int max, vector<int> &pre){
    if(n == 0){
        cout << N << '=';
        for(int i = 0;i < pre.size() - 1; i++) cout << pre[i] << '+';
        cout << pre.back() << endl;
        return;
    }
    if(max == 1){
        cout << N << '=';
        for(int i = 0;i < pre.size(); i++) cout << pre[i] << '+';
        for(int i = 0;i < n - 1; i++) cout << 1 << '+';
        cout << 1 << endl;
        return;
    }
    if(max > n) {
        split(n, n, pre);
        return;
    }
    pre.push_back(max);
    split(n-max, max, pre);
    pre.pop_back();
    split(n, max - 1, pre);
}

int main(){
    N = 10;
    vector<int> pre;
    split(N, N, pre);
}

结果

10=10
10=9+1
10=8+2
10=8+1+1
10=7+3
10=7+2+1
10=7+1+1+1
10=6+4
10=6+3+1
10=6+2+2
10=6+2+1+1
10=6+1+1+1+1
10=5+5
10=5+4+1
10=5+3+2
10=5+3+1+1
10=5+2+2+1
10=5+2+1+1+1
10=5+1+1+1+1+1
10=4+4+2
10=4+4+1+1
10=4+3+3
10=4+3+2+1
10=4+3+1+1+1
10=4+2+2+2
10=4+2+2+1+1
10=4+2+1+1+1+1
10=4+1+1+1+1+1+1
10=3+3+3+1
10=3+3+2+2
10=3+3+2+1+1
10=3+3+1+1+1+1
10=3+2+2+2+1
10=3+2+2+1+1+1
10=3+2+1+1+1+1+1
10=3+1+1+1+1+1+1+1
10=2+2+2+2+2
10=2+2+2+2+1+1
10=2+2+2+1+1+1+1
10=2+2+1+1+1+1+1+1
10=2+1+1+1+1+1+1+1+1
10=1+1+1+1+1+1+1+1+1+1
2 全排列
#include "iostream"
#include "vector"
using namespace std;

const int N = 10;
int a[N] = {1,2,3,4,5};
int m = 4;

void arrangement(int n){
    if(n == m - 1){
        for(int i = 0;i < m; i++) cout << a[i] << ' ';
        cout << endl;
        return;
    }

    for(int i = n; i<m;i++){
        swap(a[i], a[n]);
        arrangement(n+1);
        swap(a[i], a[n]);
    }

}

int main(){
    arrangement(0);
}

结果

1 2 3 4 
1 2 4 3 
1 3 2 4 
1 3 4 2 
1 4 3 2 
1 4 2 3 
2 1 3 4 
2 1 4 3 
2 3 1 4 
2 3 4 1 
2 4 3 1 
2 4 1 3 
3 2 1 4 
3 2 4 1 
3 1 2 4 
3 1 4 2 
3 4 1 2 
3 4 2 1 
4 2 3 1 
4 2 1 3 
4 3 2 1 
4 3 1 2 
4 1 3 2 
4 1 2 3 
组合数
const int N = 5;
int a[N] = {1, 2, 3, 4, 5};
int m = 3;

void combination(vector<int> &res, int n) { // C(N, m)
    if (m - res.size() > N - n) return;
    if (m - res.size() == N - n) {
        for (int i = 0; i < res.size(); i++) cout << res[i] << ' ';
        for (int i = n; i < N; i++) cout << a[i] << ' ';
        cout << endl;
        return;
    }
    res.push_back(a[n]);
    combination(res, n + 1);
    res.pop_back();
    combination(res, n + 1);
}

int main() {
    vector<int> res;
    combination(res, 0);
}

结果

1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5 
汉诺塔
void hanoi(int from, int temp, int to, int n){
    if(n == 1){
        cout << from << "->" << to << endl;
        return;
    }

    hanoi(from, to, temp, n-1);
    cout << from << "->" << to << endl;
    hanoi(temp, from, to, n-1);
}

int main() {
    hanoi(1, 2, 3, 3);
}

结果

1->3
1->2
3->2
1->3
2->1
2->3
1->3

标签:pre,10,递归,几个,max,int,例子,split,res
From: https://blog.csdn.net/weixin_37253733/article/details/145076798

相关文章

  • 请说说你对JavaScript中的递归、PTC、TCO和STC的了解
    在JavaScript中,递归、PTC(ProperTailCall,适当的尾调用)、TCO(TailCallOptimization,尾调用优化)和STC(SyntacticTailCall,语法级尾调用)是关键概念,尤其在处理复杂问题和优化代码性能时显得尤为重要。以下是对这些概念的详细解释:1.递归(Recursion)递归是一种函数自我调用的技术,常用......
  • 文件筛选与提取、递归解压工具RecursiveDecompression
    RecursiveDecompression是我用C#开发的一款实用工具,主要包括文件提取、递归解压缩两个功能。假设我要把 D:\Temp\CalcNotepad这个路径里面所有扩展名为vb的文件复制到另一个地方,一个一个复制很麻烦。 打开RD工具,选择源文件夹,然后选择目标路径D:\Test1(提前创建一个空白文件......
  • 124.【C语言】数据结构之快速排序的小区间优化和非递归的解决方法
    目录1.小区间优化测试代码运行结果2.非递归的解决方法(重要!)递归产生的问题一般来说,递归改非递归有两种方法算法分析递归产生的二叉树栈的示意图先写代码框架再填写细节部分1.小区间优化回顾121.【C语言】数据结构之快速排序(未优化的Hoare排序存在的问题)以及......
  • 递归+pair
    https://codeforces.com/contest/2053/problem/C#include<bits/stdc++.h>#definelcp<<1#definercp<<1|1#defineINF2e9usingnamespacestd;#defineendl'\n'usingll=longlong;usingpii=pair<ll,int>;constdoubl......
  • vscode配latex,用于latex排版,花了几个小时终于研究明白了(已总结)
    掉坑里了,切记texlive必须要安装,不然就是下面这样子步骤一:texlive安装链接:https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/下载完后双击ISO文件,再双击install-tl-windows.bat双击install-tl-windows.bat之后会自动跳转1-2个页面到下面这个页面......
  • 用python调用AlistClient 批量递归下载百度网盘指定目录文件,基于Alist
    importosimportrequestsfromalistimportAlistClientfromurllib.parseimportunquote,urlparsedefdownload_file(url,local_path):response=requests.get(url,stream=True)total_size=int(response.headers.get('content-length',0))......
  • 递归算法实践--到仓合单助力京东物流提效增收
    作者:京东物流李硕一、背景京东物流到仓业务「对商家」为了减少商家按照京东采购单分货备货过程,对齐行业直接按照流向交接,提升商家满意度;「对京东」揽收操作APP提效;到仓合单功能应运而生;二、问题一次批量采购单(一次50或者100个采购单)需要根据不同的规则合并成多个订单;每一个......
  • CMakeLists.txt例子
    #需求的最低的cmake程序版本cmake_minimum_required(VERSION3.12)#本工程的名字project(OpenGLTEST1)#本工程支持的C++版本set(CMAKE_CXX_STANDARD17)#指定GLFW和GLEW的头文件目录#定义GLEW_STATICadd_definitions(-DGLEW_STATIC)#将funcs文件夹纳入......
  • 旅游风景视频素材库好用的有哪些?分享几个爆火的旅游视频素材
    在数字化时代,旅游风景视频已成为人们记录和分享旅行经历的重要方式。无论是制作旅游宣传片、短视频还是个人Vlog,高质量的风景视频素材都是不可或缺的资源。本文将分享几个爆火的旅游视频素材,并推荐几个好用的正版素材网站。爆火的旅游视频素材分享晨曦中的长城一段4K画质......
  • rust学习十六.1、并发-乱弹和一个简单并发例子
    如书本作者所言,并发编程在绝大部分语言中,都是相对复杂和困难的。所以,涉及的内容会相对多一些,所涵盖的内容绝对不是几篇文章所可以容纳的。权当一个乱弹琴!和此系列的其它文章一样,本文的内容绝大部分来自于相关书籍,本人做了一些摘裁的工作,取我所需! 一、无畏并发*1.并发(con......