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

系列综述:

💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。

🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。

🤭结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢🎈🎄🌷!!!

🌈【C++】秋招&实习面经汇总篇


文章目录


😊点此到文末惊喜↩︎


一、基础

概述

  1. 暴力递归

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

    • 题目
      • 给定三根柱子,记为A,B,C,其中 柱子上有N个盘子,从下到上编号为0 ~ N-1,且上面的盘子一定比下面的盘子小。问:将A柱上的盘子经由B柱移动到C最少需要多少次?其中
      • ① 一次只能移动一个盘子
      • ② 大的盘子不能压在小盘子上

cpp 复制代码
// 将盘堆看做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. 例题:将栈内元素逆序
    • 题目
      • 将栈中的元素进行逆序
cpp 复制代码
// 取出栈中的最后一个元素并返回
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. 例题:生成字符串的所有无重复子序列(有序,但可以不相邻)
cpp 复制代码
// 参数中带&等价于全局变量
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. 全排列
    • 输出一个数组的全排列
cpp 复制代码
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. csdn图相关算法
  2. 汉诺塔(图文结合),超好理解
  3. 待定引用
  4. 待定引用
相关推荐
R6bandito_几秒前
自实现FLASH读取函数中的隐式类型转换bug踩坑记录
c语言·开发语言·经验分享·stm32·单片机·mcu·bug
memcpy02 分钟前
LeetCode 1208. 尽可能使字符串相等【不定长滑窗,字符串】1497
算法·leetcode·职场和发展
阿Y加油吧4 分钟前
LeetCode 二叉树双王炸!二叉树展开为链表 + 前序 + 中序还原二叉树|小白递归一把过
算法·leetcode·链表
AI科技星7 分钟前
全球AI信息场(信息网)基础理论与数学建模研究(乖乖数学)
开发语言·人工智能·线性代数·算法·机器学习·数学建模
云中飞鸿15 分钟前
qt中显示日志的一般是哪个控件?
开发语言·qt
仟濹15 分钟前
【算法打卡day37(2026-04-04 周六)】DFS专项训练4-枚举专项训练 1-全部是蓝桥杯真题
算法·蓝桥杯·深度优先
汀、人工智能19 分钟前
12 - 内置函数:Python的瑞士军刀
数据结构·算法·数据库架构·图论·python的瑞士军刀
maxmaxma29 分钟前
ROS2机器人少年创客营:Python第三课
开发语言·python·机器人·ros2
J2虾虾1 小时前
Java使用jcifs读取Windows的共享文件
java·开发语言·windows
羊小猪~~1 小时前
LLM--微调(Adapters,Prompt,Prefix)
算法·ai·大模型·llm·prompt·adapters·prefix