【浅谈递归(二)】常见递归问题的分析与解答

本文深入探讨了递归在解决经典问题中的应用,包括汉诺塔问题、集合子集问题、字符串全排列问题和机器人寻路问题。通过分析问题并提供递归解决方案,阐述了递归函数的设计技巧,如子问题分解、剪枝优化和构造法。对于每个问题,都详细讲解了解题思路和实现代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、经典递归问题

1、汉诺塔问题

题目描述:古代有一个梵塔,塔内有三个座 A、B、C,A 座上有 64 个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这 64 个盘子从 A 座移到 B 座,但每次只能允许移动一个盘子,并且在移动过程中,3 个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用 B 座,要求打印移动的步骤。如果只有一个盘子,则不需要利用 B 座,直接将盘子从 A 移动到 C。
现在有 n 个圆盘从上往下从小到大叠在第一根柱子上,要把这些圆盘全部移动到第三根柱子要怎么移动呢?请找出需要步骤数最少的方案。

分析:现在我们要将 n 个盘子移到第三个塔上,假如我们将 n-1 个移到第二个。再将剩下的一个移到第三个。最后把 n-1 个移回第三个上。
令 Hanno(n,Ta,Tb Tc) 表示借助 Tb 塔,把 n 个盘子,从 Ta 塔移到 Tc 塔。那么根据问题分解可知

Hanno(n,Torigin,Temp,Tdes)可以分解为
Hanao(n-1,Torigin,Tdes,Temp); //借助Tdes,把n-1个盘子,从Torigin移到Temp
move(1,Torigin,Tdes);//把剩下的一个盘子移到Tdes
Hanno(n-1,Temp,Torigin,Tdes)//记住Torigin,把Temp中剩下的n-1个盘子移到Tdes,至此问题得以解决。
三步实现,问题已经解决
当n=1时,直接移动,move(Ta,Tc)//结束条件

实现代码

#include<iostream>
using namespace std;
int i=0;
void move(char Ta,char Tb){
    cout<<"第"<<i<<"步:"<<"盘子从"<<Ta<<"----->"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值