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

九连环的玩法规则用一句话来概括就是:如果你想要卸掉某一环或者装上某一环,只需要保留这一环前面一环,再之前所有的环都卸掉。(例如你想要卸掉或者装上第9环,那么保留第8环,第8环之前的所有的环都卸掉)其中第一环可以直接卸掉。(其实第一第二这两环可以一起装上一起卸掉,我们在逻辑上只是规定第一环可以自由移动)

那么按照递归的思想来实现这个问题,还是比较简单的。与之前提到的不同的是:这次对于某一环的操作不是一种,牵扯到装上和卸掉两种基本操作,所以针对九连环要设置一个标记状态——state:九连环在上,state=1;九连环在下,state=0 。这个在Node类中实现。(如同c++中的struct)

其中num属性表示环号,state表示环的状态。

第二个需要准备的就是利用ArrayList实现的一个栈,来将所有state=1的环压入栈中。九连环规则中要求:要想对某一环进行操作,要保证这一环的前一环state=1 且在栈顶。

第三个就是操作过程move,根据state的不同,设置move操作不同。

准备条件做好了,就是要设计递归实现了。首先写一下设计的思想(伪代码)

play(n){n=1://基础情形move(n);n>1:while(!deal)//没有完成对这一环的操作{(n-1).state=1://前一环在上stack.pop=n-1://前一环为栈顶move(n);deal=true;stack.remove(size-2);//将第n环从栈中移走(并不是仅能够在栈顶进行操作的完全意义上的栈)stack.pop!=n-1://前一环不是栈顶for(i=n-2 to 1)find index where index.state!=0;//从大到小找到第一个在上的环(栈中在第n-1环之前的环)play(index);//将这个发现的在上的环移走(n-1).state=0://前一环不在上play(n-1);//执行对前一环的操作(即如果前一环在上就移走,如果不在上就装上)  }
}

这个只是将某一环移走或者装上的操作,如果将整个游戏都结束,在执行函数的时候需要从高到低依次移走这些环。(见main函数)。main函数中还需对九连环的初始状态以及栈的初始状态进行初始化。(见main函数)

运行结果如下:(四个环)

具体实现,直接贴代码:

import java.util.*;
public class NC {public static void move(Node node) {if(node.state==1)System.out.println("down "+node.num);elseSystem.out.println("up "+node.num);}public void play(Node[]node,ArrayList<Node> list,int n) {boolean deal=false;if(n==1) {if(node[n].state==1){move(node[n]);// move the 1st;node[n].state=0;list.remove(list.size()-1);}else{move(node[n]);node[n].state=1;list.add(node[n]);}}else {while(!deal){if(node[n-1].state==1) {//前一环在上if(list.get(list.size()-1).num==n-1)//前一环为栈顶{if(node[n].state==1){move(node[n]);node[n].state=0;deal=true;list.remove(list.size()-2);}else{move(node[n]);node[n].state=1;deal=true;list.add(list.size()-1,node[n]);}}else//前一环在上,但是前一环不是栈顶{int index=1;for(int i=n-2;i>0;i--)//找到前一环之前的所有在上的环中最大的一个。{if(node[i].state==1) {index=i;break;}}play(node,list,index);//将前一环之前的在上的最大的一环移走}}//-------------------------------------------------------------------------                else if(node[n-1].state==0) {//前一环不在上play(node,list,n-1);}}}}public static void main (String[]args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt();Node []node= new Node[n+1];for(int i=1;i<n+1;i++)node[i]=new Node(i,1);ArrayList<Node> list= new ArrayList();for(int j=n;j>0;j--)list.add(node[j]);NC nc= new NC();for(int t=n;t>0;t--)nc.play(node, list,t);       }
}class Node{int num;int state;public Node(int num,int state) {this.num=num;this.state=state;}
}

Java递归解决“九连环”公式相关推荐

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

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

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

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

  3. Java 递归解决 quot;仅仅能两数相乘的计算器计算x^yquot; 问题

    Java 递归解决 "仅仅能两数相乘的计算器计算x^y" 问题 /*** 求一个数的乘方* 求x^y,y是一个正整数. 设计算器仅仅能计算两数相乘,不能一次计算n个数相乘. * 知 ...

  4. java递归解决百元百鸡_JS计算输出100元钱买100只鸡问题的解决方法

    本文实例讲述了JS计算输出100元钱买100只鸡问题的方法.分享给大家供大家参考,具体如下: 问题: 公鸡5元一只,母鸡3元一只,小鸡1元买三只,我现在有100元钱要买100只鸡,问怎么买? 解决方法 ...

  5. Java递归解决老鼠走迷宫问题

    思路 1 表示障碍 代码 public class MiGong{public static void main(String[] args){int[][] map = new int[8][7]; ...

  6. Java通过递归解决0-1背包问题的代码

    下面的内容段是关于Java通过递归解决0-1背包问题的内容. public class Knapsack { public static void main(final String... args) ...

  7. java递归1加到10,递归1-初识递归

    才毕业的开发小白,最近在使用node.php和vue,有兴趣的小伙伴可以加群 134246716,大家一起学习,这是一个新建群,有兴趣的初学者可以来一起学习哦. I. 递归简论 递归的概念 当一个函数 ...

  8. java递归基础掉用_Java递归基础

    java递归基础掉用 对于那些不知道递归是什么的人(并且像个大笑者一样),请单击以下链接:Google搜索:递归,然后单击"您的意思是--"项. 希望您终于弄清楚了递归是指其自身的 ...

  9. java递归处理单位人员组织机构树

    java递归处理单位组织机构树 什么是递归? 什么时候用递归呢? 递归的注意事项! 第一步首先封装组织部门数据 第二步写Controller调用 第三步打开postman测试一下成果 下面总结一下递归 ...

最新文章

  1. Linux 防火墙开放特定端口 (iptables)
  2. SpannableString
  3. SpringBoot系列: SpringBoot 启动慢的问题
  4. Caching和Purgeable Memory (译)
  5. C语言实现简单贪吃蛇代码
  6. novatel计算odom--GPS坐标与UTM坐标转换
  7. 数据库时间相减_sql中两个时间类型相减得到的值
  8. 窝囊同事做测试三年未涨工资,被开当天,bat全部高管门口迎接。
  9. jQuery监听鼠标滚轮事件
  10. 半监督学习与直推式学习
  11. [转载] 柴静《看见》新书发布会
  12. Centos5反p2p模块安装精要
  13. excel减法函数_会计小白的EXCEL学习笔记
  14. oracle12免安装版配置,配置免安装版Oracle客户端
  15. 探讨地铁区间隧道应急照明设计方案
  16. 最新版本 Stable Diffusion 开源 AI 绘画工具之汉化篇
  17. 数据可视轻松制作多点飞线图
  18. gensim学习之corpora.Dictionary
  19. 数据库释放空间时不能使用delete
  20. 成立三年多的即刻搜索看起来在消失

热门文章

  1. 【论文笔记】FedGraph:Federated Graph Learning with Intelligent Sampling
  2. Mybatis-Plus查询中排除标识字段,如密码等
  3. 同花顺选股python开发_量化之路-python绘图-高仿同花顺绘制股票K线图+均线+成交量+MACD+KDJ(附代码)...
  4. 外贸推广怎么做最有效
  5. 万事皆显出自发偶然之态,但自有其规律-《爆发·大数据时代预见未来的新思维》笔记与心得
  6. 四川农信计算机招聘笔试成绩,2018四川农信社招聘考试题库:计算机试题一
  7. Theme.AppCompat.Light.DarkActionBar 问题解决方法
  8. java游戏开发什么游戏_JAVA可以做什么类的游戏
  9. 八爪鱼数据抓取,智联招聘为例
  10. sml完整形式_DVD的完整形式是什么?