java 中递归的实现 以及利用递归方法实现汉诺塔
今天说下java语言中比较常见的一种方法,递归方法。
递归的定义
简单来说递归的方法就是“自己调用自己”,通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度。对于编程来说,每次递归都会减少数据量;
java中递归的模式
每个递归函数的开头一定是判断递归结束条件是否满足的语句(一般是if语句);函数体一定至少有一句是“自己调用自己”的。每个递归函数一定有一个控制递归可以终结的变量(通常是作为函数的参数而存在)。每次自己调用自己时,此变量会变化(一般是变小),并传送给被调用的函数。
下面是一个递归实现阶乘的简单程序
public static void main(String args[])
{
int n=8;
int x;
x=demo(n);
System.out.println(x); } public static int demo(int n)
{ int y; y=demo(n-1)*n;
return y;
} }
该程序只能简单的实现已输入数字的递归,可以将上述的改为用户自己输入的形式去实现递归的结果;(有多中用户输入的方法暂时不涉及)
汉诺塔问题看似简单,却在思考上需要耗费大量的时间,如果不采用递归的方法的话,在实现上很难完成
题目大致是这样的:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子C上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动
接下来分析下这个问题
1.如果有A上有一个圆盘,直接将圆盘移到C上
2.如果有n个圆盘的话,则将前n-1个圆盘先移到B上,然后将自己移到,C上
所以这个问题可以分3步实现
1.将A上的n-1个圆盘借助C塔转移到B塔上
2把剩下的一个圆盘放到C上
3.将B上的n-1个圆盘借助A盘放到C盘上
以下是代码的实现
import javax.swing.JOptionPane;
public class Hannuo {
public static void main(String args[])
{
String w=" ";
w=JOptionPane.showInputDialog("please input panzishu");
int j=0;
char a='a',b='b',c='c';
j=Integer.parseInt(w);
move(j,a,b,c);
}
public static void move(int m,char a,char b,char c)
{
if(m==1)
{
JOptionPane.showMessageDialog(null,a+"->"+c," ",JOptionPane.PLAIN_MESSAGE);
}
else
{
move(m-1,a,c,b);
JOptionPane.showMessageDialog(null,a+"->"+c," ",JOptionPane.PLAIN_MESSAGE);
move(m-1,b,a,c);
}
}
}
java 中递归的实现 以及利用递归方法实现汉诺塔的更多相关文章
- 用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)
汉诺塔问题源于印度的一个古老传说:梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.梵天命令婆罗门把圆盘按大小顺序重新摆放在另一根柱子上,并且规定小圆盘上不能放 ...
- 图解汉诺塔问题( Java 递归实现)
汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题--汉诺塔问题. 先看下百度百科是怎么定义汉诺塔的规则的: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候 ...
- 零基础入门学习Python(24)--递归:汉诺塔
知识点 这节课主要讲解用递归的方法,实现汉诺塔的解答 对于游戏的玩法,我们可以简单分解为三个步骤: 1) 将前63个盘子从X移动到Y上. 2) 将最底下的第64个盘子从X移动到Z上. 3) 将Y上的6 ...
- java实现汉诺塔算法
package com.ywx.count; import java.util.Scanner; /** * @author Vashon * date:20150410 * * 题目:汉诺塔算法(本 ...
- java中递归的方法的实例
package com.demo.recursion; // 所谓递归,是指程序调用自身,当然,递归不会无休止地调用下去,它必然有一个出口,当满足条件时程序也就结束了,不然的话,那就是死循环了.// ...
- java利用递归实现汉诺塔算法
package 汉诺塔; //引入Scanner包,用于用户输入 import java.util.Scanner; public class 汉诺塔算法 { public static void m ...
- 算法笔记_013:汉诺塔问题(Java递归法和非递归法)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...
- 化繁为简 经典的汉诺塔递归问题 in Java
问题描述 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑 ...
- 数据结构--汉诺塔--借助栈实现非递归---Java
/*汉诺塔非递归实现--利用栈 * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量 * 2.先进栈,在利用循环判断是否栈空, * 3.非空情况下,出栈,检查是否只有一个盘子--直接移 ...
随机推荐
- TaintDroid:智能手机监控实时隐私信息流跟踪系统(三)
4.3 原生代码标记传播 Native 代码是不受TaintDroid监控的.理想情况下,我们获得了相同的传播语义当使用相同的解释副本时.因此,为了精确的在Java层进行污点监控,我们定义了两个必 ...
- javascript深入之location对象和history对象
浏览器的location 和history对象: 一.location对象: 1>location.reload() 相当于按浏览器上的“刷新”(IE)或“Reload”(Netscape)键. ...
- Linux历史上线程的3种实现模型
一.概述 这里以Linux为例.Linux历史上,最开始使用的线程是LinuxThreads,但Li ...
- C语言之scarf函数
一 基本用法 scanf函数:接收用户的输入 语法: scanf("格式化控制符",地址列表); 例: int num; scanf("%d",&num ...
- Javascript使用postMessage对iframe跨域通信
今天才发现原来有这么个好东西啊,跨域通信太方便了, 举个小栗子: 共两个页面, 页面1:www.a.com/a.html 页面2:www.b.com/b.html 实现目标:两个网站页面实现跨域相互通 ...
- Unity在安卓的一些路径
APK安装之后找不到路径 公司的测试机(安卓)基本都是不带SD卡的. APK在安卓手机上安装之后,使用手机助手类的软件打开文件管理,打开 内置SDK卡/Android/data/ 在这个目录下却发现 ...
- 字典(Tire树)
4189 字典 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 最经,skyzhong得到了一本好厉害的字典,这个 ...
- Linux环境快速部署Zookeeper集群
一.部署前准备: 1.下载ZooKeeper的安装包: http://zookeeper.apache.org/releases.html 我下载的版本是zookeeper-3.4.9. 2.将下载的 ...
- 《DSP using MATLAB》示例Example6.4
图形表达如下: 代码: b = [1, 0, 0, 0, 16+1/16, 0, 0, 0, 1]; [b0, B, A] = dir2cas(b, 1) 运行结果: 写成公式为
- Selenium也是一个用于Web应用程序测试的工具
Selenium也是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozilla Firefox.Mozilla Suite ...