《C++ 递归、搜索与回溯》第1题:汉诺塔问题

《C++ 递归、搜索与回溯》第1题:汉诺塔问题

🔥个人主页:Cx330🌸

❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》

《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔

《Git深度解析》:版本管理实战全解

🌟心向往之行必能至


🎥Cx330🌸的简介:


前言:

聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力

目录

前言:

递归,搜索与回溯算法前置知识

1. 汉诺塔

算法原理(递归):

思路:

算法流程:

解法代码(C++):

博主手记(字体还请见谅哈):

结尾:


递归,搜索与回溯算法前置知识

1. 汉诺塔

题目链接:

面试题 08.06. 汉诺塔问题 - 力扣(LeetCode)

题目描述:

题目示例:

算法原理(递归):

思路:

这是一道递归方法的经典题目,我们可以先从最简单的情况考虑:

  • 假设 n=1 ,只有一个盘子,很简单,直接把它从A中拿出来,移到C上;
  • 如果 n=2呢?这时候我们就要借助 B 了,因为先盘子必须时刻都在大盘子上面,共需要3步(为了方便叙述,记A中的盘子从上到下为 1号,2号)
    • 1号盘子放到 B 上
    • 2号盘子放到 C上
    • 3号盘子放到 C 上
      至此,C中的盘子从上到下为 1号,2号。
  • 如果 n>2 呢?这时我们需要用到 n=2 时的策略,将A上面的两个盘子挪到 B 上,再将最大的盘子挪到 C 上 ,最后将 B 上的小盘子挪到 C 上就完成了所有步骤。假如 n=3 时如下图:

因为 A 中最后处理的是最大的盘子,所以在移动过程中不存在大盘子在小盘子上的情况。
则本题可以解释为:

  • 对于规模为 n 的问题,我们需要将 A 柱上的 n 个盘子移动到C柱上。
  • 规模为 n 的问题可以被拆分为规模为 n-1 的子问题:
    • a.将 A 柱上的上面 n-1 个盘子移动到B柱上。
    • b.将 A 柱上的最大盘子移动到 C 柱上,然后将 B 柱上的 n-1 个盘子移动到C柱上。
  • 当问题的规模变为 n=1 时,即只有⼀个盘子时,我们可以直接将其从 A 柱移动到 C 柱
  • 需要注意的是,步骤 2.b 考虑的是总体问题中的 子问题b 情况。在处理子问题的子问题b 时,我们应该将 A 柱中的最上面的盘子移动到 C 柱,然后再将 B 柱上的盘子移动到 C 柱。在处理总体问题的子问题b 时,A 柱中的最大盘子仍然是最上面的盘子,因此这种做法是通用的
算法流程:

递归函数设计:void hanotaa(vector& A, vector& B, vector& C, int n)

  • 返回值:无;
  • 参数:三个柱子上的盘子,当前需要处理的盘子个数(当前问题规模)。
  • 函数作用:将 A 中的上面 n 个盘子挪到 C 中

递归函数流程:

  • 当前问题规模为 n=1 时,直接将 A 中的最上面盘子挪到 C 中并返回
  • 递归将 A 中最上面的 n-1 个盘子挪到 B 中;
  • 将 A 中最上面的⼀个盘子挪到 C 中;
  • 将 B 中上面 n-1 个盘子挪到 C 中
解法代码(C++):
class Solution { public: void dfs(vector<int>& A, vector<int>& B, vector<int>& C,int n) { if(n==1) { C.push_back(A.back()); A.pop_back(); return; } dfs(A,C,B,n-1); C.push_back(A.back()); A.pop_back(); dfs(B,A,C,n-1); } void hanota(vector<int>& A, vector<int>& B, vector<int>& C) { int n=A.size(); dfs(A,B,C,n); } };
博主手记(字体还请见谅哈):

结尾:

汉诺塔问题的递归解法,通过分解问题规模,将n个盘子的移动转化为n-1个子问题。算法核心是将A柱的n-1个盘子暂存B柱,移动最大盘子到C柱,再将B柱盘子移到C柱。并强调递归终止条件(n=1时直接移动),展示了递归思想在经典算法问题中的应用

Read more

MCP客户端与服务端初使用——让deepseek调用查询天气的mcp来查询天气

MCP客户端与服务端初使用——让deepseek调用查询天气的mcp来查询天气

本系列主要通过调用天气的mcp server查询天气这个例子来学习什么是mcp,以及怎么设计mcp。话不多说,我们开始吧。主要参考的是B站的老哥做的一个教程,我把链接放到这里,大家如果有什么不懂的也可以去看一下。 https://www.bilibili.com/video/BV1NLXCYTEbj?spm_id_from=333.788.videopod.episodes&vd_source=32148098d54c83926572ec0bab6a3b1d https://blog.ZEEKLOG.net/fufan_LLM/article/details/146377471 最终的效果:让deepseek-v3使用天气查询的工具来查询指定地方的天气情况 技术介绍 MCP,即Model Context Protocol(模型上下文协议),是由Claude的母公司Anthropic在2024年底推出的一项创新技术协议。在它刚问世时,并未引起太多关注,反响较为平淡。然而,随着今年智能体Agent领域的迅猛发展,MCP逐渐进入大众视野并受到广泛关注。今年2月,

By Ne0inhk
可以在命令行通过大模型使用上下文协议(MCP)与外部工具交互的软件:小巧的MCPHost

可以在命令行通过大模型使用上下文协议(MCP)与外部工具交互的软件:小巧的MCPHost

小巧的MCPHost MCPHost 可以在命令行下使用,使大型语言模型(LLM)能够通过模型上下文协议(MCP)与外部工具进行交互。目前支持Claude 3.5 Sonnet和Ollama等。本次实践使用自己架设的Deepseek v3模型,跑通了Time MCP服务。  官网:GitHub - mark3labs/mcphost: A CLI host application that enables Large Language Models (LLMs) to interact with external tools through the Model Context Protocol (MCP). 下载安装 使用非常方便,直接下载解压即可使用。官网提供Windows、Linux和MacOS三个系统的压缩包: https://github.com/

By Ne0inhk
实战篇:Python开发monogod数据库mcp server看完你就会了

实战篇:Python开发monogod数据库mcp server看完你就会了

原创不易,请关注公众号:【爬虫与大模型开发】,大模型的应用开发之路,整理了大模型在现在的企业级应用的实操及大家需要注意的一些AI开发的知识点!持续输出爬虫与大模型的相关文章。 前言 目前mcp协议是给deepseek大模型插上工具链的翅膀,让大模型不仅拥有超高的推理和文本生成能力,还能具备执行大脑意识的工具能力! 如何开发一个mcp? mcp是一种协议,指的是模型上下文协议 (Model Context Protocol)。 官方结成的mcp https://github.com/modelcontextprotocol/python-sdk mcp库 pip install mcp from mcp.server.fastmcp import FastMCP 我们先来做一个简单的案例 from mcp.server.fastmcp import FastMCP import requests mcp = FastMCP("spider") @mcp.tool() def crawl(

By Ne0inhk
【大模型实战篇】基于Claude MCP协议的智能体落地示例

【大模型实战篇】基于Claude MCP协议的智能体落地示例

1. 背景         之前我们在《MCP(Model Context Protocol) 大模型智能体第一个开源标准协议》一文中,介绍了MCP的概念,虽然了解了其概念、架构、解决的问题,但还缺少具体的示例,来帮助进一步理解整套MCP框架如何落地。         今天我们基于claude的官方例子--获取天气预报【1】,来理解MCP落地的整条链路。 2. MCP示例         该案例是构建一个简单的MCP天气预报服务器,并将其连接到主机,即Claude for Desktop。从基本设置开始,然后逐步发展到更复杂的使用场景。         大模型虽然能力非常强,但其弊端就是内容是过时的,这里的过时不是说内容很旧,只是表达内容具有非实时性。比如没有获取天气预报和严重天气警报的能力。因此我们将使用MCP来解决这一问题。         构建一个服务器,该服务器提供两个工具:获取警报(get-alerts)和获取预报(get-forecast)。然后,将该服务器连接到MCP主机(在本例中为Claude for Desktop)。         首先我们配置下环

By Ne0inhk