java实现的经典递归算法三例

一、写作此文的原因:

学过程序设计的朋友都知道,存在自调用的算法称作递归算法。 递归往往能给我们带来非常简洁非常直观的代码形势,从而使我们的编码大大简化,然而递归的思维确实很我们的常规思维相逆的,我们通常都是从上而下的思维问题, 而递归趋势从下往上的进行思维,正由于此,很多人对于递归有着深深的恐惧,我曾经也是如此,如今为把我的经验通过几个经典的例子与初学者共享,故作此文,希望能对需要者有所助益,如若如此,便是幸甚……

二、递归算法设计的基本思想是:对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解。

关键要抓住的是:

(1)递归出口

(2)地推逐步向出口逼近

三、具体说明

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_java实现的经典递归算法三例相关推荐

  1. c语言编程经典实例利润,C语言经典编程实例100题解答

    C语言经典编程实例100题 答案+答案 C语言经典编程实例100题C语言程序实例100个(一) [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数,都是多少, 1.程序 ...

  2. python3经典实例_Python3十大经典错误及解决办法

    接触了很多Python爱好者,有初学者,亦有转行人.不论大家学习Python的目的是什么,总之,学习Python前期写出来的代码不报错就是极好的.下面,严小样儿为大家罗列出Python3十大经典错误及 ...

  3. python编程入门经典实例-Python编程语言入门经典案例

    [程序1] 题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. 1#!/usr/bin/python 2#-*- coding:utf-8 -*- 3#there is no + ...

  4. 递归Java_Java递归算法经典实例

    原标题:Java递归算法经典实例 简单递归定义 什么叫递归?(先定义一个比较简单的说法,为了理解,不一定对) 递归:无限调用自身这个函数,每次调用总会改动一个关键变量,直到这个关键变量达到边界的时候, ...

  5. java古典兔子问题c语言,Java递归算法经典实例(经典兔子问题)

    Java递归算法经典实例(经典兔子问题) 题目:古典问题:3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析:首先我们要明白题目的意思 ...

  6. c语言递归法1 2 n,递归法_C语言递归法_递归算法经典实例(2)

    在网上搜索梵塔游戏fanta.exe,自己动手,体会梵塔问题,尝试解决问题. 3 问题分析 教师提出问题: 1. 盘子移动过程中的两个要求? 2. 寻找规律:(教师引导,学生描述移动过程) (1)两个 ...

  7. matlab土体变形实例,ansys案例——20例ansys经典实例】.pdf

    ansys案例--20例ansys经典实例] [ANSYS 算例]3.3.7(3) 三梁平面框架结构的有限元分析 针对 [典型例题]3.3.7(1) 的模型,即如图3-19 所示的框架结构,其顶端受均 ...

  8. 一个线程中lock用法的经典实例

    1 /* 2 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 3 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 4 作者: ...

  9. .net ticks 转java_《C#并发编程经典实例》—— 转换.NET事件

    声明:本文是<C#并发编程经典实例>的样章,感谢图灵授权并发编程网站发布样章,禁止以任何形式转载此文. 问题 把一个事件作为 Rx 输入流,每次事件发生时通过 OnNext 生成数据. 解 ...

  10. SQL经典实例(五)元数据查询

    列举模式中的表 Oracle select table_name from all_tables where owner = 'SCOTT'; MySQL select table_namefrom ...

最新文章

  1. SQL Server 2008之WaitFor
  2. 【连载】优秀程序员的45个习惯之39——架构师必须写代码
  3. Citrix Xendesktop中VDA注册DDC的流程
  4. MySQL中购买的语句,mysql操作语句 - 买灰机自己开的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. 中国工程院院士:物联网市场须走出碎片化
  6. 前端学习(1494):表格案例--axios-搜索功能
  7. Centos7下安装Python3.5
  8. 数据中心网络vs云网络vs容器网络
  9. 哈尔滨工程大学微型计算机原理与接口技术,2017年哈尔滨工程大学 哈工大 微型计算机原理与接口技术 复试硕士招生考试大纲...
  10. Android开发技巧:给Button的点击上色
  11. 计算机软件lumion的使用例子,Lumion怎么用?BIM软件教学:带你掌握Lumion实战应用...
  12. Python功能实现:为pdf电子书籍生成书签目录
  13. 读计算机网络得学五笔吗,打破无聊难学 另类五笔学习方法
  14. 拍出来好看的拍照软件?这4款好看好用的App简直赞到爆~
  15. Gerrit用户登录显示Forbidden
  16. 百度杀毒+7654联盟
  17. oracle 纵列 转 横列,oracle sql小结(主要讲横列转换的例子)decode 以及case
  18. 有关绩效考核系统的一些想法
  19. 左倾红黑树Go语言实现
  20. 国企的判断标准是什么 怎么查企业是私企还是国企

热门文章

  1. 1 LoRa 基本知识(参考LoRa物联网通信技术)
  2. UniWebView3.8
  3. win10任务栏怎么还原到下面_如何让你的Win10桌面变得更好看?
  4. 用拉普拉斯变换求零状态响应_什么是UPS?为什么用UPS?关于UPS电源的知识都在这里!...
  5. DTW(动态时间归整)算法的前世今生
  6. 约瑟夫环数据结构课程设计详解
  7. 数据结构课程设计(已完结)
  8. 80套基于PHP+MYSQL 的毕设设计(系统+论文)
  9. 蓝桥杯官网题库【简单题解析】持续更新
  10. 利用OpenCV实现对车流量的统计