递归类C++

1、汉诺塔

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

Why?为什么这个汉诺塔问题可以用递归来解决?

如何来解决汉诺塔问题?

如果N == 1时,A[0] B C,直接将A上的盘子转移到C上面。

如果N == 2时,A[1,0] B C,先将上面所有的盘子放到B,然后将A上最大的那个放到C,再把B上的盘子转移到C。

如果N == 3,先将上面两个盘子,借助C,放到B上,然后把最下面的盘子放到C上,再将B上的两个盘子,借助A,放到C上。那么此时,转移上面两个盘子的操作,是不是和N == 2时的操作一模一样了。相同的子问题就出来了。并且由于A最下面是最大的盘子,那么过程中借助A柱子时,就不用担心大的放到小的上面去了。

如果N == n时,…………

 分析可知:

解决本题时,可以分割出子问题,并且子问题的解决方法和主问题相同。

在解决子问题时,分割出子子问题,解决子子问题的时候,方法又和子问题一样。

本题体现:解决N = 4时,出现了N = 3的情况;解决N = 3时,出现了N = 2的情况…………

此时就可以用递归解决。

How?如何编写递归的代码?

1、重复子问题--->函数头

将X柱子上的一堆盘子,借助Y柱子,转移到Z柱子上。

void dfs(X,Y,Z,int n),n代表要转移多少个盘子。

2、只关心某一个子问题在做什么--->函数体

dfs(X,Z,Y,N-1)   //将X上面N-1个盘子,借助Z放到Y上。

X.back() --> Z  //将X的最后一个盘子,放到Z上。

dfs(Y,X,Z,N-1)  //再将Y上所有的N-1个盘子,借助X,放到Z上。

3、递归的出口(哪一个子问题不能再细分了)

当N == 1时,不用借助柱子就能完成,所以递归的出口就是N == 1

if( N == 1) X.back --> Z   //X.back()移到Z上。

class Solution {
public:
    void dfs(vector<
  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Python中,递归是一种编程思想,也可以应用于对象。递归对象意味着对象内部调用自己的方法。递归对象的实现方式和递归函数似,需要定义一个出口条件来终止递归调用。 举个例子,假设我们有一个对象`Foo`,其中包含一个方法`recursive_method`,这个方法在内部会调用自身。在`recursive_method`的实现中,我们需要定义一个出口条件,当满足这个条件时,方法将不再递归调用自身,而是返回结果。 例如,下面是一个简单的示例代码: ```python class Foo: def recursive_method(self, n): if n <= 0: # 出口条件 return print(n) self.recursive_method(n - 1) # 递归调用 obj = Foo() obj.recursive_method(5) ``` 在上述示例中,`recursive_method`方法接收一个参数`n`,当`n`小于等于0时,方法终止递归调用。在每次递归调用中,方法会打印当前的`n`值,并将`n`减1后再次调用自身。 这样,通过递归对象的方法,我们可以实现一些需要重复执行似操作的场景,例如遍历一个对象的属性或执行一些复杂的计算过程。递归对象可以让代码更加简洁和可读,并且提供了一种灵活的方式来处理复杂的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [第二十七天&python中和对象(2)&递归与推导式&简单算法](https://blog.csdn.net/xbxbgk/article/details/126395115)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夹心宝贝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值