首页
学习
活动
专区
圈层
工具
发布

汉诺塔问题(java递归实现)

汉诺塔问题 - 力扣(LeetCode) 有 A,B,C 三根柱子,A 上面有 n 个盘子,我们想把 A 上面的盘子移动到 C 上,但是要满足以下三个条件: 每次只能移动一个盘子; 盘子只能从柱子顶端滑出移到下一根柱子...如图所示:可以抽象分为三大块思路 我们发现n=x的情况下 把A上方n-1个方块放入B中 跟n=3的情况下 又需要将2个盘子存入B中的情况是一样的 解决n=3的时候 又相当于将n=2的时候解决 可知一个大问题里面有相同的子问题...1 ,子问题1里面又有一样的子问题2 所有这里可以运用到递归 递归代码实现 1.重复的子问题(编写函数头) 每次需要借助3个盘子 然后跟传递的方块 dfs(A,B,C,n-1) 2.只需关注其中一个子问题里面的细节...C.add(A.remove(A.size()-1)) 3.最后B通过A存入C中 dfs(B, A, C, n - 1); 3.找到递归出口

35210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    经典递归问题--汉诺塔(java实现)

    经典递归问题–汉诺塔(java实现) 一、什么是递归 1.递归的定义 程序调用自身的编程技巧称为递归; 如求阶乘: public static int fac(int n) {...2.递归过程的详细解释 我们通常能够看懂简单的递归代码,但是自己上手写的时候却总是想不到思路,这是因为我们对递归的理解不够深入; 下面是对递归的深入理解: 递归是一个整体的动作 递归中 递 和 归...的最后部分内容 ) 下面是图例解释: 我们在上述图片可以看到: 红色箭头所指部分均是 “递过程” 蓝色箭头所指向的部分 均是归过程 而函数栈帧内 就说我们常说的 方法体,也可以叫做递推公式 二、汉诺塔问题...在了解完递归的原理之后,我们来解决一下汉诺塔的问题 1.汉诺塔(hanoi)的介绍 有三根相邻的柱子,标号为A,B,C, A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子...,即 A->C B->C C->A A->C B->A B->C A->C 2.过程分析 从上述过程我们知道,随机盘数的增加,其移动次数成指数式增长,代码也会变得复杂; 为了缩减代码复杂度,我们使用 递归方法来解决问题

    65910

    图解汉诺塔问题( Java 递归实现)

    汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题——汉诺塔问题。 先看下百度百科是怎么定义汉诺塔的规则的: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。...我相信,有很多童鞋在学递归的时候,都会受到这个问题的困扰。别着急,你不是一个人,我第一次看到这个也是一脸懵逼,这什么鬼啊,这么复杂。...下面我通过图解的方式,演示整个移动过程,帮助你理解用递归解决这个问题的思想。 汉诺塔图解 我们一步一步从简单到复杂。为了方便,我把三个柱子从左到右分别叫 A,B,C。盘子的数字从上到下依次增大。...所以,可以看到,这个拆分的过程,就是不断递归的过程。而每次递归时,都可以把第 1 个盘子到 第 n-1 个盘子看成一个整体。每一次递归都是一个三步曲,借助另外一个柱子,从当前柱子移动到目标柱子。

    1.2K10

    Java递归

    一、概述 1、递归 在当前方法内调用自己的这种现象; 2、递归的分类 直接递归: 方法自身调用自己; 间接递归: A方法调用B方法,B方法调用C方法,C方法调用A方法; 3、注意 ①递归一定要有条件的限定...,保证要能停下来,否则会发生栈内存溢出; ②在递归中虽然有限定条件,但递归的次数不能太多,否则也会发生栈内存溢出; ③构造方法,禁止递归; 4、递归使用的前提 当调用方法的时候,方法的主体不变,每次调用方法的参数不同...,可以使用递归; 二、递归的使用 1、计算1-n的和 分析: num的累加 = num + (num-1)的累和,所以可以把累加和的操作定义成一个方法,递归调用; 代码实现: package study.recursion

    80210

    Java解决递归造成的堆栈溢出问题

    标题:Java解决递归造成的堆栈溢出问题 简介: 在使用递归算法时,经常会遇到堆栈溢出的问题,特别是处理大规模的数据时。本文将介绍如何使用Java解决递归造成的堆栈溢出问题。 1....了解堆栈溢出问题 堆栈溢出是指程序在执行时,调用栈的深度超过了系统定义的上限,导致程序运行出错。在递归算法中,每次递归调用都会消耗一定的栈空间,如果递归的层次太深或者数据量太大,就容易造成堆栈溢出。...优化递归算法 为了解决堆栈溢出问题,可以对递归算法进行优化。一种常见的优化方法是尾递归优化,即将递归调用放在函数的末尾,并将结果作为参数传递给下一次调用。这样可以避免递归调用时消耗堆栈空间。...result = fibonacci(10); System.out.println(result); } } 在上述代码中,使用循环来计算斐波那契数列的第n个数,避免了使用递归造成的堆栈溢出问题...结论: 递归算法在处理大规模数据时容易造成堆栈溢出问题。为了解决这个问题,可以使用尾递归优化或将递归算法转换为循环算法。通过对递归算法的优化和改造,可以有效避免堆栈溢出问题。

    52810

    算法--递归--走台阶问题(2种递归+递归改循环)

    递归: 一个问题可以分解成若干子问题,且求解思路一样,当到一定的情况下有终止条件,这样的问题可以用递归方法求解 注意事项: 递归调用深度太大,栈空间会耗尽溢出 注意避免调用中某些值的重复计算(见以下代码...3) 递归,频繁调用函数,时间成本高(见以下代码1) 递归代码可以改成循环代码 (见以下代码2) 问题1 给你 n 个台阶,你的最大步幅是2步,可以一次走1步,也可以一次走2步,问有多少种走法?...(未考虑重复计算问题) 以下所有代码原来采用 size_t 溢出,改用 unsigned long #include using namespace std; unsigned long...3.递归代码(避免重复计算问题) 代码 1 中的 f(n), 比如 n = 5 时 ?...问题2 给你 n 个台阶,你的最大步幅是2步,可以一次走1步,也可以一次走2步,先迈左脚,要求最后到达时是右脚,问有多少种走法? 解法1:模拟实际的行走,暴力搜索 /** 1.

    2.5K20

    【详解】使用Java解决递归问题:五人年龄计算

    使用Java解决递归问题:五人年龄计算背景介绍假设有一个场景:5个人坐在一起。...这个问题可以通过递归的方式来解决。递归是一种在程序中调用自身的方法来解决问题的技术。在这个例子中,我们可以定义一个方法来根据每个人相对于前一个人的年龄差来计算他们的年龄。...运行结果运行上述程序,输出结果为:第五个人的年龄是: 18 岁这个问题可以通过递归或者简单的循环来解决。这里我将提供两种方法的Java代码示例:一种是使用递归的方法,另一种是使用循环的方法。...这个问题可以通过递归或迭代的方式来解决。下面我将分别介绍两种方法的Java实现。方法一:递归递归方法通过函数自身调用自己来解决问题,直到达到一个已知条件(在这个问题中,第一个人的年龄是已知的)。...输出无论是使用递归还是迭代方法,最终输出的结果都是:第五个人的年龄是: 18这两种方法都可以有效地解决问题,选择哪种方法取决于具体的需求和个人偏好。

    21010

    递归问题系列—— C语言

    递归训练 递归的问题说难不难,说简单也不简单,关键的点就在找到递归的式子的特性,然后找到递归结束的地方。...递归说白了就是函数通过直接或者间接的方式调用自己 递归用什么语言实现都一样,关键是找到递归的递推公式和递归结束的标志即可 说的再多,还不如直接练呢 一、求和问题 小明准备开始背单词,计划用十天,第一天背一个单词...,阶乘比上面那个问题更简单 2.2 递归讲解 我要求5的阶乘,就得知道5x4! ...;//递归的迭代式 return f; } 三、求年龄 3.1 问题描述 有5个人坐在一起,问第5个人多少岁?...3.2 问题解析 这又是一个递归问题,直接上代码了 #include int fac(int n) { if(n==1) return 10; else

    1.9K10
    领券