• 【左程云算法全讲13】暴力递归


    系列综述:
    💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
    🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
    🤭结语:如果有帮到你的地方,就点个赞关注一下呗,谢谢🎈🎄🌷!!!
    🌈【C++】秋招&实习面经汇总篇



    😊点此到文末惊喜↩︎


    一、基础

    概述

    1. 暴力递归

      • 本质
        • 遍历尝试形成一颗遍历树,并可对该树模型进行剪枝优化
        • 遍历树中递归函数执行的次数,就是树的分叉数量
        • 将一个大问题如何拆解成同样含义,并且数据量变小的子问题
      • 递归结束条件就是叶子结点的符合条件,或者剪枝条件
        在这里插入图片描述
      • 优化方法
        • 分支限界:暴力递归的过程中进行过滤
    2. 例题:汉诺塔

      • 题目
        • ​ 给定三根柱子,记为A,B,C,其中 柱子上有N个盘子,从下到上编号为0 ~ N-1,且上面的盘子一定比下面的盘子小。问:将A柱上的盘子经由B柱移动到C最少需要多少次?其中
        • ① 一次只能移动一个盘子
        • ​② 大的盘子不能压在小盘子上
          在这里插入图片描述
          在这里插入图片描述
    // 将盘堆看做0号盘子和1~N-1号盘子,然后进行移动
    void func(int N, string from, string to, string orher) {
    	if (N == 1) {
    		cout << "Move 1 from" + from + "to" + to;
    	} else {
    		// 函数调用注意形参的位置和含义
    		func(N-1, from, other, to);	// N-1个圆盘到other上
    		cout << "Move" + N + " from " + from + " to " + to;	// 将第N个圆盘挪到to上
    		func(N-1, other, to, from);	// 将剩下N-1个圆盘从other挪到to上
    	}
    }
    // 主调函数
    void hanoi(int n) {
    	if (n > 0) 
    		func(n, "left", "right", "mid");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 例题:将栈内元素逆序
      • 题目
        • ​ 将栈中的元素进行逆序
    
    // 取出栈中的最后一个元素并返回
    int func(stack<int> st) {
    	int result = stack.pop();	// 获取栈顶元素并弹出
    	if (stack.empty()) {
    		return result;
    	} else {
    		int bottom = func(st);	// 获取最底部的元素
    		st.push(result);		// 压入元素
    		return bottom;			// 递归传递最低元素
    	}
    }
    
    void reverse(stack<int> st) {
    	int result = st.pop();
    	if (st.empty()) return ;
    	int i = f(st);	// 取出栈中最低的元素
    	reverse(st);	// 一直取到栈中没有元素了
    	st.push(i);		// 再将元素压入栈
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    1. 例题:生成字符串的所有无重复子序列(有序,但可以不相邻)
      在这里插入图片描述
    // 参数中带&等价于全局变量
    void Process(const string &str, int index, unordered_set<string> &res, string &path) {
    	if (index == str.size()){
    		res.emplace(path);
    		return ;
    	} 
    	// 不选择当前index字符
    	string no = path;
    	Process(str, index+1, res, no);
    	// 选择当前index字符
    	string yes = path + str[index];
    	Process(str, index+1, res, yes);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1. 全排列
      • 输出一个数组的全排列
        在这里插入图片描述
    void process(string str, int i, vector<string> &res) {
    	if (i == str.size()) {
    		res.push_back(str);
    	}
    	// 如果i没有终止,i...都可以来到i位置
    	for (int j = i; j < str.size(); ++j) {
    		swap(str[i], str[j]);		// 交换
    		process(str, i+1, res);	// 递归
    		swap(str[i], str[j]);		// 还原
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11


    少年,我观你骨骼清奇,颖悟绝伦,必成人中龙凤。
    不如点赞·收藏·关注一波

    🚩点此跳转到首行↩︎

    参考博客

    1. csdn图相关算法
    2. 汉诺塔(图文结合),超好理解
    3. 待定引用
    4. 待定引用
  • 相关阅读:
    小米路由器青春版R1CL刷入OpenWrt
    Webpack Chunk 分包规则
    Kafka3.2.0 安装配置
    【STL源码剖析】vector类模拟实现 了解底层-走进底层-掌握底层【超详细的注释和解释】
    OpenCV4 :并行计算cv::parallel_for_
    秋招面经第七弹:网易一面-数据开发工程师
    scrapy案例教程
    一文速学-最小二乘法曲线拟合算法详解+项目代码
    【软考软件评测师】第十六章 性能测试基础
    基于一致性算法的微电网分布式控制MATLAB仿真模型
  • 原文地址:https://blog.csdn.net/qq_43840665/article/details/134458108