九连环是我国传统的益智游戏,从小就觉得能解开九连环是件非常了不起的事情,但大一自己亲手试验了下发现也不过如此,不过解九连环的操作里充分体现了递归思想,这里将用代码实现解开一个九连环的全部过程,并打印出中间步骤;
前提知识:第1环可以直接解开或者安装上,要解开第k环,必须要求k-1环在横梁上,并且k-1环以下所有环都已经拆下,安装上九连环过程为其逆过程;

这里我们用一个长度为9的一维数组代表九连环,每一位上都只能存‘0’或者是‘1’,‘0’代表拆下,‘1’代表未拆下,初始状态9个环全部都在横梁上,皆位‘1’,并未拆下,最终状态为所有环全部拆下,每一位皆为‘0’。
代码实现如下:
package useful;import java.util.Arrays;public class TestNine {/*** 用来表示九连环的成员数组,每一位代表一个环,该位置上只可能是'0'或是'1',数值'0'代表已经拆下,'1'代表未拆下;*/static int[] arr;/*** 用来记录拆下九连环总共所需操作数,初始位0步*/static int step = 0;public static void main(String[] args) {int n = 9; //九连环arr = new int[n];for(int i=0; i<n; i++) //初始化九连环数组,都置为1代表初始每个环都在横梁上arr[i] = 1;System.out.println("初始化九连环状态:" + Arrays.toString(reverse(arr))); //初始打印九连环数组状态solve(n);}/*** 解开所有前1~n个环的方法* @param n*/private static void solve(int n) {for(int i=n-1; i>=0; i--) //从高位到低位逐个解开remove(i);}/*** 仅装上第k位环的方法* @param k*/private static void install(int k) {if(k < 0 || arr[k] == 1) return; //若该环本来就在,则直接返回if(k == 0) {setOne(k); return;} //若该环位为第一环,直接装上install(k-1); //先装上前一个环clear(k-1); //再拆掉前一环之前的所有环setOne(k); //最后将该环装上}/*** 仅拆除第k位环方法* @param k*/private static void remove(int k) {if(k == -1 || arr[k] == 0) return; //若该环本来就不在,则直接返回if(k == 0) {setZero(k); return;} //若该环位为第一环,直接拆除install(k-1); //先装上前一个环clear(k-1); //再拆掉前一环之前的所有环setZero(k); //最后将该环拆掉}/*** 拆除第k位下面的所有环(不包括第k个环)* @param k*/private static void clear(int k) {if(isClear(k)) return; //若全部拆除,则返回for(int i=k-1; i>=0; i--) { //从高位到低位逐个拆除remove(i);}}/*** 将九连环数组上第i位置为'0'方法,代表此时拆下该环* @param i*/private static void setZero(int i) {if(i >= 0 && i < 9) {if(arr[i] == 0) return; //若本身就是0,函数即刻返回arr[i] = 0;/*若执行到这,说明这里含有置0操作,那么一定操作了九连环,需要即刻打印出新状态下的九连环如下*/System.out.println("第 " + ++step + "步--置‘0’操作:拆下第" + (i+1) + "环-此刻九连环状态:" + Arrays.toString(reverse(arr)));}}/*** 将九连环数组上第i位置为'1'方法,代表此时装上该环* @param i*/private static void setOne(int i) {if(i >= 0 && i < 9) {if(arr[i] == 1) return; //若本身就是1,函数即刻返回arr[i] = 1;/*若执行到这,说明这里含有置1操作,那么一定操作了九连环,需要即刻打印出新状态下的九连环如下*/System.out.println("第 " + ++step + "步--置‘1’操作:装上第" + (i+1) + "环-此刻九连环状态:" + Arrays.toString(reverse(arr)));}}/*** 判断九连环上第k环以下所有环是否都已经拆下* @param k 第k环* @return 若全已经拆下,或者该k环为第1环,则返回true,否,返回false*/private static boolean isClear(int k) {if(k == 0)return true;for(int i=0; i<k; i++)if(arr[i] == 1)return false;return true;}/*** 实际中的九连环是最右手边是第1环,逐渐向左边一环解一环,这里为了更好说明问题,* 也将数组翻转了下,数组从左向右依次为9~1环,这样将从右往左依次解开* @param arr 九连环数组,函数里不改变该数组的数值* @return 返回只为了打印显示用的新数组*/private static int[] reverse(int[] arr) {int[] c = new int[arr.length];for(int i=arr.length-1; i>-1; i--)c[i] = arr[arr.length - 1 - i];return c;}
}

最终输出的结果截图如下:

(中间省略3张图.....)

递归解九连环并且打印中间过程相关推荐

  1. python递归解压文件_递归调用解压zip包或rar包

    不知道有没有小伙伴跟我一样犯这样的懒,一些简单重复的工作,总是嫌麻烦,懒得一步步去做,还每次都重复一样的操作.比如解压zip或rar的包,也许你会说,不就解压嘛,有啥的.问题来了,如果只是一个简单的压 ...

  2. python递归解压文件_Python之路10-递归调用解压zip包或rar包

    不知道有没有小伙伴跟我一样犯这样的懒,一些简单重复的工作,总是嫌麻烦,懒得一步步去做,还每次都重复一样的操作.比如解压zip或rar的包,也许你会说,不就解压嘛,有啥的.问题来了,如果只是一个简单的压 ...

  3. php打印出函数的内容吗,PHP打印函数集合详解以及PHP打印函数对比详解(精)

    1 echo();2 print();3 die();4 printf();5 sprintf();6 print_r();7 var_dump(); 1 echo() 可以同时输出多个字符串,可以多 ...

  4. Java递归解压zip压缩包

    场景:zip压缩包里面嵌套多层文件夹或者zip压缩包: 使用递归的方式进行解压,解压后得到的目录结构和压缩包目录结构完全一致,非常好用! package com.zhh.api.util;import ...

  5. 24点游戏的递归解法和Python实现

    24点游戏的递归解法和Python实现 目录 24点游戏的递归解法和Python实现 什么是24点游戏 递归思路 递归 24点问题的递归思路 Python代码实现 四则运算下无解的组合 总结 什么是2 ...

  6. java break递归_如何利用Java递归解决“九连环”公式

    在之前有写到过一点点有关递归的东西,然后想到小时候自己玩的一个玩具--九连环.小时候自己曾经一边玩一边用笔记下来解开这个东西的公式,那是十几年前的事情了.前两天突然想起来,九连环的基本操作就是一个递归 ...

  7. 递归遍历文件夹,递归解压,压缩文件,写解压和压缩过程的日志,

    前言:好久好久没另写一篇博客了,都是在更新QT常用函数里面内容,这瘟疫影响了我躁动奋进的心,又是大半年没努力了,气人! 这次做的是个多个压缩包 将压缩包里面的内容合并起来 打包成对应的压缩包的工具. ...

  8. java 递归10 28_如何利用Java递归解决“九连环”公式

    在之前有写到过一点点有关递归的东西点击打开链接,然后想到小时候自己玩的一个玩具--九连环.小时候自己曾经一边玩一边用笔记下来解开这个东西的公式,那是十几年前的事情了.前两天突然想起来,九连环的基本操作 ...

  9. IO流(五)__文件的递归、Properties、打印流PrintStream与PrintWriter、序列流SequenceInputStream...

    一.文件的遍历 1.需求:对指定目录进行所有的内容的列出(包含子目录的内容)-文件的深度遍历 思想:递归的思想,在递归的时候要记住递归的层次. public class FileTest {publi ...

最新文章

  1. 采用PHP实现”服务器推”技术的聊天室
  2. svn cleanup失败
  3. 15.8.2 泛型数组
  4. newlisp debugger
  5. 域名状态:运营商设置了客户禁止删除保护?过期域名也不能注册为什么?
  6. DB2临时表空间的作用
  7. 【elasticsearch】Elasticsearch : alias数据类型
  8. jquery级试题_jQuery经典面试题及答案精选
  9. 面向串口编程java_Java串口编程例子
  10. python必背入门代码-Python零基础入门学习笔记(一)
  11. 解决Mac电脑在启动时出现空白屏幕情况的解决方法
  12. 电路的计算机辅助分析实验报告,电力系统计算机辅助分析实验报告.doc
  13. 计算机软件如何永久删除,如何彻底删除电脑软件
  14. python sasl_Pyhive、SASL和Python 3.5
  15. 【总结】浏览器 User-Agent 大全
  16. 开发板ping不通虚拟机
  17. 最近弄到了2件好东西
  18. 汽车电子业务升级方式说明
  19. 去中心网络服务器,去IOE 去中心化_浪潮服务器_网络安全-中关村在线
  20. 加州大学伯克利分校是如何培养计算机学生的

热门文章

  1. ROSbag解压图片
  2. Spark深入解析(三):Spark基础解析之Spark环境搭建(不同模式)
  3. 计算机设备更新理由,电脑硬件明明升级了,为什么速度还这么慢?四种原因在背后作怪!...
  4. Java回炉之File
  5. 解决import org.junit.Test 和@Test报错
  6. 准确率,召回率,mAP,ROC,AUC,特异性,敏感性,假阴性,假阳性
  7. mysql连接数尖刺激增_mysql最大连接数max_connections
  8. 正确选择合适的移动应用测试工具很重要
  9. 如何在计算机桌面上添加小工具,怎么在电脑的桌面小工具里添加便签
  10. 高通9xxx系列模块modem射频 RF LTE B41频段踩过的坑