1。汉诺塔
这是递归的超经典的例子,几乎每本程序设计书上谈到递归都会介绍。具体情景不再赘述。以我上述的方法观之:(1)递归的出口在于disk数为一的时候
(2)向出口逼近:如果不是一,是n ,则我们先挪动上面n-1块disk,等上面挪完,即递归返回的时候,我们挪动最底下的disk。
仅仅如此,一个貌似十分复杂的问题就解决了,因为挪动那n-1块disk的时候,会继续向上减少,直到disk的数量为一为止。下面给出java程序编码(已测试过,运行正常):
import javax.swing.JOptionPane;
public class Hanoi {
private static final String DISK_B = "diskB";
private static final String DISK_C = "diskC";
private static final String DISK_A = "diskA";
static String from=DISK_A;
static String to=DISK_C;
static String mid=DISK_B;
public static void main(String[] args) {
String input=JOptionPane.showInputDialog("please input the number of the disks you want me move.");
int num=Integer.parseInt(input);
move(num,from,mid,to);
}
private static void move(int num, String from2, String mid2, String to2) {
if(num==1){
System.out.println("move disk 1 from "+from2+" to "+to2);
}
else {
move(num-1,from2,to2,mid2);
System.out.println("move disk "+num+" from "+from2+" to "+to2);
move(num-1,mid2,from2,to2);
}
}
}
2。这是一个排列的例子,它所做的工作是将输入的一个字符串中的所有元素进行排序并输出,例如:你给出的参数是"abc" 则程序会输出:
abc
acb
bac
bca
cab
cba
(1)算法的出口在于:low=high也就是现在给出的排列元素只有一个时。
(2)算法的逼近过程:先确定排列的第一位元素,也就是循环中i所代表的元素,
然后low+1开始减少排列元素,如此下去,直到low=high
public static void permute(String str) {
char[] strArray = str.toCharArray();
permute(strArray, 0, strArray.length - 1);
}
public static void permute(char[] list, int low, int high) {
int i;
if (low == high) {
String cout = "";
for (i = 0; i <= high; i++)
cout += list[i];
System.out.println(cout);
} else {
for (i = low; i <= high; i++) {
char temp = list[low];
list[low] = list[i];
list[i] = temp;
permute(list, low + 1, high);
temp = list[low];
list[low] = list[i];
list[i] = temp;
}
}
}
3.这是一个组合的例子,与上述的例子相似,只是它所做的工作是,输出所给字符串中制定数目的元素的组合种类
(1)程序出口在于n=1,此时只要输出目标数组的所有元素即可
(2)逼近过程,当n>1 的时候,我们先取第一个元素放入目标数组中,然后n-1,如此下去,最后出来。
import javax.swing.JOptionPane;
public class Combination {
/**
* @param args
*/
public static void main(String[] args) {
String input = JOptionPane
.showInputDialog("please input your String: ");
String numString = JOptionPane
.showInputDialog("please input the number of your Combination: ");
int num = Integer.parseInt(numString);
Combine(input, num);
}
private static void Combine(String input, int num) {
char[] a = input.toCharArray();
String b = "";
Combine(a, num, b, 0, a.length);
}
private static void Combine(char[] a, int num, String b, int low, int high) {
if (num == 0) {
System.out.println(b);
} else {
for (int i = low; i < a.length; i++) {
b += a[i];
Combine(a, num - 1, b, i+1, a.length);
b=b.substring(0, b.length()-1);
}
}
}
}
分享到:
相关推荐
Java 递归例子中提供了三个经典的递归例子:汉诺塔问题、斐波那契级数和最大公约数。 1. 汉诺塔问题 汉诺塔问题是 Java 递归的经典例子。汉诺塔问题是指有三个座 A、B、C,A 座上有 64 个盘子,盘子大小不等,大的...
java递归小例子,供初学者学习使用。九九递归
Java递归读取文件例子 Java递归列出目录下全部文件 /** * 列出指定目录的全部内容 * */
### Java编写的递归算法的经典事例:全排列输出 #### 概述 本文将详细介绍一个用Java编写的递归算法实例,该实例用于实现字符数组的所有可能全排列。通过这个例子,我们可以深入理解递归的基本概念、工作原理以及...
文档"Java递归算法.docx"可能包含了关于如何在实际代码中应用递归的例子,例如经典的Fibonacci序列计算、阶乘计算或者二分查找等。这些例子有助于理解递归的工作原理和如何在Java中实现它们。 "Java递归算法.pdf...
### Java中的经典递归 #### 一、递归的基本概念 递归是一种常见的算法思想,在计算机科学中占有重要地位。简单来说,递归是指在函数的定义或执行过程中调用自身的方法。递归通常用于解决那些可以分解为相似子问题...
Java递归是编程中的一个重要概念,它是指在函数或方法的定义中...通过这些例子,我们可以看到Java递归在解决特定问题时的灵活性和实用性。然而,使用递归时需谨慎,确保理解和处理好递归的所有方面,以避免潜在的问题。
在这个例子中,递归调用`findFiles`会在到达文件系统中的最底层文件或目录时停止。当函数不再找到任何匹配的文件或目录,递归过程自然结束。 ### 关键知识点六:代码优化与改进 尽管当前实现有效,但可以从几个...
摘桃子问题是一个经典的递归应用案例,问题描述为:“有一个人摘桃子,第一天摘下树上桃子的一半再多吃一个,以后每天吃前一天剩下桃子的一半再多吃一个,到第10天只剩下一个桃子,问原来树上有多少个桃子?...
在这个实例中,我们将深入探讨如何使用Java递归实现阶乘计算,并以1到10的数字为例进行演示。 阶乘是一个数学概念,表示一个正整数n的所有小于等于n的正整数的乘积,通常表示为n!。例如,5的阶乘(5!)是5 × 4 × ...
在这个例子中,factorial()方法是递归的。当传入参数 n 等于 0 时,方法返回 1。否则,方法返回 n 与 factorial(n-1)的乘积。这样,递归地计算阶乘,直到 n 等于 0 为止。 Java 递归算法是一个强大的工具,可以用于...
一个简单的小例子递归实现list按照index排序的树
这个"JAVA递归DEMO"可能是一个示例,演示了如何使用递归来遍历XML文档的所有元素。XML(可扩展标记语言)是用于存储和传输数据的标准化格式,而递归遍历则能有效地处理其层次结构。 首先,让我们了解递归的基本概念...
### Java中的递归详解 #### 一、递归的基本概念 在Java编程语言中,递归是一种非常重要的算法思想和技术手段。递归是指一个方法直接或间接地调用自身的过程。这种自我调用的方式可以用来解决很多复杂的问题,并且...
15个典型的递归算法的JAVA实现,求N的阶乘、欧几里德算法(求最大公约数)、斐波那契数列、汉诺塔问题、树的三种递归遍历方式、快速排序、折半查找、图的遍历、归并排序、八皇后问题(回溯、递归)、棋盘覆盖(分治,...
在Java编程中,递归是一种强大的技术,常用于解决复杂问题,例如数据结构的遍历、树形结构的绘制等。本示例中,我们利用Java递归来简单地画出一棵树,这是一个典型的图形用户界面(GUI)应用,通过NetBeans IDE实现...
在这个场景中,"java_DWR递归函数实现城市的省市县三级联动" 提供了一个利用DWR处理多级联动选择的实例,特别适用于中国的行政区域划分,包括省、市、县三级。这种功能常见于地址选择、物流配送等业务场景。 首先,...
在Java中,递归的实现简洁且直观,但同时也需要程序员对递归的原理有深刻理解,以便正确处理递归深度和效率问题。本文将通过三个递归示例—汉诺塔问题、斐波那契数列和最大公约数(GCD)计算—来探讨递归在Java编程...
汉诺塔问题是一个经典的递归问题,源自印度的一个古老传说。问题的目标是将A座上的所有盘子按照规则移动到C座。关键在于每次只能移动一个盘子,并且任何时候大盘子都不能位于小盘子之上。递归解决方案是:首先将A座...
在Java编程中,递归是一种强大的技术,常用于解决复杂问题,例如遍历或搜索文件系统中的文件夹。本文将详细解析如何使用Java编写一个递归程序来搜索Windows文件夹,以及涉及到的相关知识点。 首先,我们需要理解...