科技公司网站建设/网站结构优化

科技公司网站建设,网站结构优化,五百亿网站建设,网络营销是学什么- 第 82 篇 - Date: 2025 - 03 - 17 Author: 郑龙浩/仟濹 【递归与动态规划(DP) C/C】 文章目录 一 递归1基本介绍2 递归技巧**(1) 递归三步法****(2) 思维小技巧** 3 例题(1) 阶乘 (纯递归 or DP)(2) 斐波那契数列 (纯递归 or DP)(3) 汉诺塔 (纯递归 or DP)**① 英文打印过程…

- 第 82 篇 -
Date: 2025 - 03 - 17
Author: 郑龙浩/仟濹
【递归与动态规划(DP) C/C++】

文章目录

  • 一 递归
    • 1基本介绍
    • 2 递归技巧
      • **(1) 递归三步法**
      • **(2) 思维小技巧**
    • 3 例题
      • (1) 阶乘 (纯递归 or DP)
      • (2) 斐波那契数列 (纯递归 or DP)
      • (3) 汉诺塔 (纯递归 or DP)
        • **① 英文打印过程的版本**
        • **② 中文打印过程的版本(为了避免自己以后复习的时候又理解错误,故写了中文打印版本)**

一 递归

我看的课程,如下视频链接

https://www.bilibili.com/video/BV1LiS1YSEgF/?share_source=copy_web&vd_source=123565abb60ee9d849adaeb118d98b85

1基本介绍

是什么

递归就是函数自己调用自己。

核心

将大问题分解成规模更小的相同问题,直到达到可直接求解的简单情况(如 n=1),再逐层返回结果。
优化 - 记忆化搜索

如果过程中会出现重复计算,则可以提前将重复计算保存下来

2 递归技巧

(1) 递归三步法

  1. 定义基准条件(确定结束条件)

    明确递归终止的边界条件(如 阶乘时的n=1 ),避免无限递归

  2. 假设子问题已解决
    将递归函数视为黑盒,直接假设它能返回子问题的正确结果(例如:算 f(n) 时,直接相信 f(n-1)f(n-2) 是对的)

    说简单点就是: 只管向问问题,它一定能返回正确答案。

  3. 组合子问题的解(拆解问题)

    用子问题的解构建当前问题的解(如 return f(n-1) + f(n-2)

    说简单点就是: 把子问题的答案组合起来,得到当前问题的解

(2) 思维小技巧

无需提前理解完整递归过程!!!

我之前就陷入了这个问题。就是我在写递归的时候,必须想清楚递归从头到尾的所有过程和细节,其实没有必要,直接当作这个递归函数已经存在且写完

递归是「自相似性」的数学抽象,只需关注当前层逻辑,无需脑补调用栈细节(如 f(n-1) 内部如何实现)

不要陷入 “先有鸡还是先有蛋“ 的思维陷阱!!!

一定要注意,我之前因为陷入这个思维陷阱,特别较真,特别想搞清楚具体过程,太没必要了

  • 直接假设递归函数已能正确工作(即使它尚未写完),基于此设计当前逻辑。这种「信任递归」的思维是突破递归障碍的关键
  • 即直接将没写完的递归函数当作已经有了的函数去写,就认为这个函数是有答案的,这么去写就可以了,无需把这个递归函数中的自身的函数当作递归函数
  • 禁止:在编码时脑补多级递归调用的堆栈状态

3 例题

(1) 阶乘 (纯递归 or DP)

不使用记忆化搜索 Or 使用记忆化搜索

// 2025-03-16
#include <bits/stdc++.h>
using namespace std;
// 不使用记忆化搜索
long long funA( long long n ) {if (n == 1)return 1;return funA(n - 1) * n;
}
// 使用记忆化搜索
// 使用数组或哈希表记忆
unordered_map <long long, long long> memo;
long long funB( long long n ) {if (n == 1)return 1;if (memo.find(n) == memo.end()) {memo[n] = funB(n - 1) * n;}return memo[n];
}int main( void ) {long long n;cin >> n;// 不使用记忆化搜索cout << "不使用记忆化搜索的答案:" << funA(n) << '\n';// 使用记忆化搜索cout << "使用记忆化搜索的答案:" << funB(n) << '\n';return 0;
}

(2) 斐波那契数列 (纯递归 or DP)

不使用记忆化搜索 Or 使用记忆化搜索

// 2025-03-16
#include <bits/stdc++.h>
using namespace std;
// 不使用记忆化搜索
long long funA( long long n ) {if (n <= 2) return 1;return funA(n - 1) + funA(n - 2);
}
// 使用记忆化搜索
// 使用数组或哈希表记忆
unordered_map <long long, long long> memo;
long long funB( long long n ) {if (n <= 2) return 1;if (memo.find(n) == memo.end())memo[n] = funB(n - 1) + funB(n - 2);return memo[n];
}int main( void ) {// 第n位斐波那契数字long long n;cin >> n;// 不使用记忆化搜索cout << "不使用记忆化搜索的答案:" << funA(n) << '\n';// 使用记忆化搜索cout << "使用记忆化搜索的答案:  " << funB(n) << '\n';return 0;
}

(3) 汉诺塔 (纯递归 or DP)

必须要注意,打印的不是 前 n 个 圆盘从某个柱子移动到某个柱子,而是 第 n 个 圆盘从某个柱子移动到某个柱子。

我刚开始想了好久,就是这个地方理解错了,我以为打印的是 前 n 个 圆盘,后来意识到是 第 n 个 圆盘以后,恍然大悟,理解了这个程序。

然后为了助于我理解,我又写了一个中文打印过程版本,以免以后复习的时候,看到这个英文打印的代码又理解错了。

① 英文打印过程的版本

代码

// 2025-03-16
// 输入圆盘数量,三个柱子标识
// 打印圆盘的移动过程: 移动数量 from ? to ? ---> 错误理解
// 打印圆盘的移动过程: 第n个 from ? to ? (这个意思是第 n 个 从 ? 移动到 ?) --> 正确理解
// 注意:该题要求的是移动过程的输出,而不是真的移动,所以不要钻牛角尖,我想了半天为什么只打印不移动,实际人家要的结果就是打印
#include <bits/stdc++.h>
using namespace std;
void hanoi(int n, char F, char A, char T) {if (n == 1) { // 递归终止条件:只剩一个盘子时直接移动// 打印:move 1 from A to C// 打印:移动第 n 个盘子到目标柱 Tprintf("move %d from %c to %c\n", n, F, T);return;}// 步骤1:将前 n-1 个盘子从 F 移到 A(借助 T 辅助)hanoi(n - 1, F, T, A); // 步骤2:打印:移动第 n 个盘子到目标柱 Tprintf("move %d from %c to %c\n", n, F, T);// 步骤3:将 n-1 个盘子从 A 移到 T(借助 F 辅助)hanoi(n - 1, A, F, T);
}
int main( void ) {int n, F, A, T;cout << "请输入圆盘数量" << endl;cin >> n;getchar();cout << "请输入起始柱、辅助柱、目标柱" << endl;scanf ("%c %c %c", &F, &A, &T);hanoi (n, F, A, T);return 0;
}

输入与运行结果

请输入圆盘数量
3
请输入起始柱、辅助柱、目标柱
A B C
move 1 from A to C
move 2 from A to B
move 1 from C to B
move 3 from A to C
move 1 from B to A
move 2 from B to C
move 1 from A to C
② 中文打印过程的版本(为了避免自己以后复习的时候又理解错误,故写了中文打印版本)

为了避免自己以后复习的时候又理解错误,故写了中文打印版本

代码

// 2025-03-16
// 输入圆盘数量,三个柱子标识
// 打印圆盘的移动过程: 移动数量 from ? to ? ---> 错误理解
// 打印圆盘的移动过程: 第n个 from ? to ? (这个意思是第 n 个 从 ? 移动到 ?) --> 正确理解
// 注意:该题要求的是移动过程的输出,而不是真的移动,所以不要钻牛角尖,我想了半天为什么只打印不移动,实际人家要的结果就是打印
#include <bits/stdc++.h>
using namespace std;
void hanoi(int n, char F, char A, char T) {if (n == 1) { // 递归终止条件:只剩一个盘子时直接移动// 打印:move 1 from A to C// 打印:移动第 n 个盘子到目标柱 Tprintf("将第 %d 个圆盘从 %c 柱子移动到 %c 柱子\n", n, F, T);return;}// 步骤1:将前 n-1 个盘子从 F 移到 A(借助 T 辅助)hanoi(n - 1, F, T, A); // 步骤2:打印:移动第 n 个盘子到目标柱 Tprintf("将第 %d 个圆盘从 %c 柱子移动到 %c 柱子\n", n, F, T);// 步骤3:将 n-1 个盘子从 A 移到 T(借助 F 辅助)hanoi(n - 1, A, F, T);
}
int main( void ) {int n, F, A, T;cout << "请输入圆盘数量" << endl;cin >> n;getchar();cout << "请输入起始柱、辅助柱、目标柱" << endl;scanf ("%c %c %c", &F, &A, &T);hanoi (n, F, A, T);return 0;
}

输入与运行结果

请输入圆盘数量
3
请输入起始柱、辅助柱、目标柱
A B C
将第 1 个圆盘从 A 柱子移动到 C 柱子
将第 2 个圆盘从 A 柱子移动到 B 柱子      
将第 1 个圆盘从 C 柱子移动到 B 柱子      
将第 3 个圆盘从 A 柱子移动到 C 柱子      
将第 1 个圆盘从 B 柱子移动到 A 柱子      
将第 2 个圆盘从 B 柱子移动到 C 柱子      
将第 1 个圆盘从 A 柱子移动到 C 柱子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/72625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C++面试] 标准容器面试点

一、入门 1、vector和list的区别 [C面试] vector 面试点总结 vector 是动态数组&#xff0c;它将元素存储在连续的内存空间中。支持随机访问&#xff0c;即可以通过下标快速访问任意位置的元素&#xff0c;时间复杂度为 O(1)&#xff0c;准确点是均摊O(1)。但在中间或开头插…

C# NX二次开发:拉伸UFUN函数避坑指南

大家好&#xff0c;今天想说一下拉伸相关UFUN函数的使用&#xff0c;尽量让大家别踩坑。 官方给出的拉伸UFUN函数有如下几个&#xff1a; &#xff08;1&#xff09;UF_MODL_create_extruded2 (view source) uf_list_p_tobjectsInputList of objects to be extruded.char *ta…

基于 Python 爬取 TikTok 搜索数据 Tiktok爬虫(2025.3.17)

1. 前言 在数据分析和网络爬虫的应用场景中&#xff0c;我们经常需要获取社交媒体平台的数据&#xff0c;例如 TikTok。本篇文章介绍如何使用 Python 爬取 TikTok 用户搜索数据&#xff0c;并解析其返回的数据。 结果截图 2. 项目环境准备 在正式运行代码之前&#xff0c;我…

关于deepseek R1模型分布式推理效率分析

1、引言 DeepSeek R1 采用了混合专家&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;架构&#xff0c;包含多个专家子网络&#xff0c;并通过一个门控机制动态地激活最相关的专家来处理特定的任务 。DeepSeek R1 总共有 6710 亿个参数&#xff0c;但在每个前向传播…

二叉树算法题实战:从遍历到子树判断

目录 一、引言 二、判断两棵二叉树是否相同 思路 代码实现 注意点 三、二叉树的中序遍历 思路 代码实现 注意点 四、判断一棵树是否为另一棵树的子树 思路 代码实现 注意点 ​编辑 五、补充 一、引言 作者主页&#xff1a;共享家9527-CSDN博客 作者代码仓库&am…

【开原宝藏】30天学会CSS - DAY1 第一课

下面提供一个由浅入深、按步骤拆解的示例教程&#xff0c;让你能从零开始&#xff0c;逐步理解并实现带有旋转及悬停动画的社交图标效果。为了更简单明了&#xff0c;以下示例仅创建四个图标&#xff08;Facebook、Twitter、Google、LinkedIn&#xff09;&#xff0c;并在每一步…

HarmonyOS第22天:解锁鸿蒙服务开发

走进鸿蒙服务开发的世界 在移动应用开发的领域中&#xff0c;HarmonyOS 以其独特的分布式理念和强大的系统能力&#xff0c;为开发者们开辟了一片崭新的天地。其中&#xff0c;服务开发作为 HarmonyOS 应用开发的关键环节&#xff0c;犹如一把神奇的钥匙&#xff0c;能够帮助开…

鸿蒙应用程序包HAP的开发与使用

1、HAP是什么&#xff1f; HAP&#xff08;Harmony Ability Package&#xff09;是应用安装和运行的基本单元。HAP包是由代码、资源、第三方库、配置文件等打包生成的模块包&#xff0c;其主要分为两种类型&#xff1a;entry和feature。 entry&#xff1a;应用的主模块&#x…

解决qt中自定插件加载失败,不显示问题。

这个问题断断续续搞了一天多&#xff0c;主要是版本不匹配问题。 我们先来看下 Based on Qt 6.6.0 → 说明 Qt Creator 本身 是基于 Qt 6.6.0 框架构建的。MSVC 2019, 64-bit → 说明 Qt Creator 是使用 Microsoft Visual C 2019 编译器&#xff08;64 位&#xff09; 编译的。…

进程间通信--匿名管道

进程间通信介绍 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&…

CSS块元素、行内元素、行内块元素详解

一、块元素&#xff08;Block Elements&#xff09; 1.定义与特点 独占一行&#xff1a;默认情况下&#xff0c;块元素会从新的一行开始&#xff0c;并且其后的元素也会被推到下一行。可设置宽高&#xff1a;可以自由设置宽度&#xff08;width&#xff09;和高度&#xff08…

Word 小黑第22套

对应大猫23 续编号&#xff08;编号断了&#xff0c;从一开始&#xff09;&#xff1a;点编号&#xff0c;再设置编号值 插入以图标方式显示的文档&#xff1a;插入 -对象 -由文件创建 &#xff08;这里要链接到文件也要勾选 不然扣一分&#xff09; 一个页面设为横向不影响上…

平面波扬声器 VS球面波扬声器的原理与优缺点对比

一、核心定义与原理 1、平面波扬声器 1.1、平面波扬声器的定义‌&#xff1a;通过“相控阵”技术控制声波相位&#xff0c;使声波以平行线&#xff08;面&#xff09;定向传播的扬声器&#xff0c;声波近似平面振动&#xff0c;能量集中且衰减缓慢‌。 1.2、平面波扬声器的原…

设计模式之命令设计模式

命令设计模式&#xff08;Command Pattern&#xff09; 请求以命令的形式包裹在对象中&#xff0c;并传给调用对象。调用对象寻找可以处理该命令的对象&#xff0c;并把该命令传给相应的对象执行命令&#xff0c;属于行为型模式命令模式是一种特殊的策略模式&#xff0c;体现的…

力扣hot100二刷——二叉树

第二次刷题不在idea写代码&#xff0c;而是直接在leetcode网站上写&#xff0c;“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路&#xff0c;编程也很流利⭐⭐Basically 基本掌握需要稍作思考&#xff0c;或者看到提示方法后能解答⭐⭐⭐Sl…

从“自习室令牌”到线程同步:探秘锁与条件变量

目录 互斥 为什么需要锁 锁的原理--互斥 锁的使用 同步 锁的问题 条件变量 互斥 为什么需要锁 先看结果&#xff1a; 以下代码是我模拟创建线程抢票&#xff0c;由于不加锁导致票抢到了负数 main.cc: #include<vector> #include<iostream> #include"…

字符串哈希从入门到精通

一、基本概念 字符串哈希是将任意长度的字符串映射为固定长度的哈希值&#xff08;通常为整数&#xff09;的技术&#xff0c;核心目标是实现O(1)时间的子串快速比较和高效查询。其本质是通过数学运算将字符串转换为唯一性较高的数值&#xff0c;例如&#xff1a; ​​​​​​…

什么是数学建模?数学建模是将实际问题转化为数学问题

数学建模是将实际问题转化为数学问题&#xff0c;并通过数学工具进行分析、求解和验证的过程。 一、数学建模的基本流程 问题分析 • 明确目标&#xff1a;确定需要解决的核心问题。 • 简化现实&#xff1a;识别关键变量、忽略次要因素。 • 定义输入和输出&#xff1a;明确模…

搭建主从服务器

任务需求 客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容为&#xff1a;Very good, you have successfully set up the system. 各个主机能够实现时间同步&#xff0c;并且都开启防…

AlexNet 有哪些首创?

现在大家每逢讨论人工智能&#xff0c;都离不开深度学习&#xff0c;这轮深度学习的热潮&#xff0c;追根溯源可以到2012年 AlexNet 的横空出世。后来&#xff0c;大家开始发现深度学习越来越强的能力。 AlexNet 的首创贡献 AlexNet&#xff08;2012年&#xff09;作为现代深…