首页 > 其他分享 >递归思想以及晕递归的解决方案

递归思想以及晕递归的解决方案

时间:2024-08-08 14:49:28浏览次数:6  
标签:src 思想 tar 圆盘 解决方案 递归 vector buf

什么情况下可以用递归的思想

一个问题可以被分为多个子问题,且子问题之间不冲突,并且多个子问题解决后,问题也被解决了。就可以用递归。

递归的思路

递归首先有一个返回条件,就是说函数肯定不能无限递归下去,那么就要有一个在问题规模较小的时候可以判断的结束条件。
其次递归分为“超级操作”和“微操作”,超级操作就是递归函数本身,而微操作一般都是“递”和“归”中的“归”过程。

如何使用递归函数

这里举个例子,就拿最典型的汉诺塔举例。

汉诺塔问题

问题描述:有从小到大的n个圆盘,圆盘按照从上至下从小到大的顺序套在柱子A上,另有柱子B,C
1.将所有圆盘转移至柱子C
2.圆盘顺序不变且必须时刻保证小圆盘在大圆盘之上
3.一次只能移动一个圆盘

这里将三根柱子分别定义为src,buf,tar。
从src转移至tar。
首先src只有一个圆盘的情况,只需要将src给tar即可,这里记为f(1)操作 。
src有两个圆盘的时候,就要借助buf缓冲,先把最小的放在buf,然后将第二个放到tar,再将最小的从buf拿到tar。这里记为f(2)。
当圆盘数量增加到3个,就可以看做是大规模情况了,那么我们怎么把三个圆盘的问题分解呢,可以把上面两个用f(2)操作,转移到buf,再把第三个移到tar,再对buf上的两个执行f(2)操作,单独转移就是f(1)操作嘛,到这里把整个过程连起来就是f(2),f(1),f(2);
那么4个,5个···n个圆盘,不就是f(n-1) ,f(1), f(n-1)的操作一直执行了吗,当然这里要注意,第一个f(n-1)和第二个f(n-1)他们的函数逻辑不变,但是柱子目标会改变。
这里贴上代码

// 汉诺塔问题
// 问题描述:有从小到大的n个圆盘,圆盘按照从上至下从小到大的顺序套在柱子A上,另有柱子B,C
//          1.将所有圆盘转移至柱子C
//          2.圆盘顺序不变且必须时刻保证小圆盘在大圆盘之上
//          3.一次只能移动一个圆盘
#include <iostream>
#include <vector>
using namespace std;
void move(vector<int>& src, vector<int>& tar) {
    int pan = src.back();
    src.pop_back();
    tar.push_back(pan);
}

void dfs(int i, vector<int>& src, vector<int>& buf, vector<int>& tar) {
    if(i == 1) {
        move(src, tar);
        return;
    }
    dfs(i - 1, src, tar, buf);
    move(src, tar);
    dfs(i - 1, buf, src, tar);
}

int main() {
    // 有序数组n=10的圆盘
    vector<int> vec;
    for(int i = 0; i < 10; ++i) {
        vec.push_back(i);
    }
    vector<int> buf, tar;
    dfs(10, vec, buf, tar);
    for(int i : tar) {
        cout << i << ' ';
    }
    return 0;
}

想不通,仔细一想就晕,怎么办,让我们来治治晕递归。

当然这里我已经会了,也懒得写,直接把我在哪学来的贴上得了。
参考资料:https://www.youtube.com/watch?v=kEWQj2Hb8kc
(这里哔站也有,哔站搜五点七边应该就出来了,再次鸣谢这位大佬)
https://www.hello-algo.com/chapter_divide_and_conquer/hanota_problem/#3

标签:src,思想,tar,圆盘,解决方案,递归,vector,buf
From: https://www.cnblogs.com/thirteen-sjq/p/18348954

相关文章

  • 二叉树的递归套路
    二叉树的递归套路二叉树结构二叉树是一个将数据组织成头尾相连的特殊链表,每一个数据单元与链表一样有一个指向其的指针,但与链表不同的是其可以有两个指向其他单元的指针,分别是其左孩子与右孩子。采用该这种结构,最终数据的呈现形式会与“链”不一样,而呈现出了一种树的结构。对......
  • linux 虚拟机有线网络消失解决方案汇总.18348485
    修复Linux虚拟机有线网络消失的解决方案汇总的一些操作(后续可能会更新)第一种方法:删除var/lib/NetworkManager/文件夹(自测Centos系统有用)1.打开终端,输入以下命令:cd/var/lib2.查询有无文件夹:findNetworkManager3.删除文件夹:rm-rfNetworkManager/4.重启。5.使......
  • ATOZ KC (Knowlege Captalization) 面向无人机研发协同设计解决方案
    在当今数字经济时代,以信息化和工业化深度融合为主线,构建支持新型产业生态和新型制造模式的创新协同研制平台体系,成为支撑企业安全绿色、降本增效和可持续性发展的关键。通过高度及时性和在线性的协同设计,使各个设计员能够基于同一上下文进行产品设计,利于在早期发现各专业之间的......
  • 快速基于 ClickHouse + Grafana 搭建可观测性解决方案 - 日志篇(ClickHouse 官方博客)
    引言作为一款高性能的OLAP数据库,ClickHouse被用于多种应用场景,包括时间序列(timeseries)数据的实时分析。其多样化的应用场景推动了大量分析函数的发展,这些函数有助于查询大多数类型的数据。这些查询特性加上高压缩率使得越来越多的用户开始利用ClickHouse来存储可观测性......
  • 智能化解决方案:提升汽车制造图文档发送效率,实现高效传输!
    汽车制造业企业数据外发需求频繁,不仅有与异地研发机构间、供应商之间的协同研发文件交换,还有与外包供应商及零部件供应商之间的基于价值链的协同关系。主要涉及的数据类型有:汽车制造图文档发送、研发数据发送、项目文件发送、反馈数据与协调文件发送等。目前大部分汽车制造业企......
  • 删除双系统误修改Win11 EFI分区的解决方案
    重要提示本文写于2024年8月,请注意文章内容的时效性,以免给您宝贵的电脑造成损伤。或许每个程序员都想给自己的电脑安装双系统,我也是其中之一。但是,安装Ubuntu后的两个月内,仅仅开机两次,这使我认识到它终究只是个摆设,是时候和它说再见了。删除Ubuntu其实并不麻烦,搜索“磁盘管理......
  • 趣味Python游戏编程:第3章 递归函数的威力:扫雷
    趣味Python游戏编程:第3章递归函数的威力:扫雷在第2章中,我们制作了一个拼图游戏,玩家通过鼠标操作图片块移动。本章设计一款扫雷游戏,玩法是在一个方块阵列中随机埋设一定数量的地雷,然后由玩家逐个打开方块,并以排除所有地雷为最终游戏目标。如果玩家打开的方块中有地雷,则游戏......
  • 无刷电机吸尘器pcba解决方案设计
    吸尘器是通过电流控制电机转动,形成强烈的空气涡流而使吸尘器内的密闭空间出现负压,从而吸入纸屑、灰尘等杂质,使用十分方便。吸尘器电机的基本要求是转矩大、转速高、质量轻、体积小,最好还能节能等。无论是手持式还是立式的,无绳吸尘器大都选择搭载体积轻、噪音小、吸力大并且更......
  • 基于LoRa的智慧农业解决方案--ASR6601、SX1278、SX1262
    我国《数字乡村发展战略纲要》明确指出“要推进农业数字化转型”,加快推广云计算、大数据、物联网、人工智能在农业生产经营管理中的运用。   然而,目前我国的农业数字化转型还面临着诸多挑战。我国整体农业机械化程度和自动化控制水平仍然较低。由于农田面积广袤,大量的区域没......
  • 关于LoRa的智慧农业解决方案--ASR6601、SX1278、SX1262
    我国《数字乡村发展战略纲要》明确指出“要推进农业数字化转型”,加快推广云计算、大数据、物联网、人工智能在农业生产经营管理中的运用。   然而,目前我国的农业数字化转型还面临着诸多挑战。我国整体农业机械化程度和自动化控制水平仍然较低。由于农田面积广袤,大量的区域没......