您的位置:

3的子集非递归java的简单介绍

本文目录一览:

JAVA编程问题:求汉诺塔非递归JAVA代码

public class Hannuota {

private int n;//储存盘子个数

public Hannuota(int n){

this.n = n;

}

public void function(){

//初始化三个柱子,A是开始堆满盘子的柱子,C是目标柱子

Pillar a = new Pillar(n,n,"A");

Pillar b = new Pillar(n,"B");

Pillar c = new Pillar(n,"C");

//把三个柱子按顺序排好,详见后面的算法那里的解释

Pillar[] pillars = new Pillar[3];

pillars[0] = a;

if(n%2==0){

pillars[1] = b;

pillars[2] = c;

}else{

pillars[1] = c;

pillars[2] = b;

}

//开始移动,k用来计数,移动次数为2^n-1,至于为什么,我不太清楚,

//反正有人证明过。i是用来保存最小那个盘子正在哪跟柱子上的。

int i=0;

for(int k=0;k(int)Math.pow(2, n)-1;){

int min;

//将最小的盘子顺时针移动一个柱子

min = pillars[i%3].Pop();

pillars[(i+1)%3].Push(min);

System.out.println(pillars[i%3]+"-"+pillars[(i+1)%3]);

k++;

i++;

//这个IF好像可以不要,当时写的,后面忘了删除。

if(k(int)Math.pow(2, n)-1){

//如果,剩下两根柱子中,某一根为空,则一定是非空那根中最上面个盘子

//移动到空的那个柱子上。若两根都不为空,则把编号小的一个盘子

//移动到另外跟柱子上

if(!pillars[(i-1)%3].isEmpty()(pillars[(i+1)%3].isEmpty()||pillars[(i+1)%3].Top()pillars[(i-1)%3].Top())){

min=pillars[(i-1)%3].Pop();

pillars[(i+1)%3].Push(min);

System.out.println(pillars[(i-1)%3]+"-"+pillars[(i+1)%3]);

}else{

min=pillars[(i+1)%3].Pop();

pillars[(i-1)%3].Push(min);

System.out.println(pillars[(i+1)%3]+"-"+pillars[(i-1)%3]);

}

k++;

}

}

}

//主函数,用来测试的。3表示3个盘子。

public static void main(String args[]){

new Hannuota(3).function();

}

}

class Pillar{//构造一个新类,表示柱子,实际是当一个栈在用

private int[] s;

private int top;

private String name;

public String toString(){

return name;

}

//这个构造函数用来构造BC两个柱子,下面那个用来构造柱子A。其实也可以写成一个构造函数。

public Pillar(int max,String name){

s = new int[max];

top = -1;

this.name = name;

for(int i=0;imax;i++){

s[i] = max+1;

}

}

public Pillar(int n,int max,String name){

s = new int[max];

top = n-1;

this.name = name;

for(int i=0;imax;i++){

s[i] = max - i;

}

}

//这后面这些就是栈的基本方法了,不用介绍了吧

public boolean isEmpty(){

return top==-1?true:false;

}

public int Top (){

return s[top];

}

public int Pop(){

return s[top--];

}

public void Push(int x){

s[++top] = x;

}

}

算法是这个

首先容易证明,当盘子的个数为n时,移动的次数应等于2^n - 1。

首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上。

根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;

若n为奇数,按顺时针方向依次摆放 A C B。

(1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;

若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。

(2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。

即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘

这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。

(3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。

这玩意要非递归真麻烦。需不需要加点注释?

其实我不明白干嘛非要非递归。。。

列举集合{1,2,3}的所有子集.

含有1个元素的子集有{1},{2},{3}; 含有2个元素的子集有{1,2},{1,3},{2,3}; 含有3个元素的子集有{1,2,3}.共有子集8个 子集中分别含1,2,3三个元素中的0个,1个,2个或者3个

用java编写hanoi塔的非递归算法。

这是个好问题,很少看到有人写汉诺塔的非递归...其实只要先写出递归,然后把递归的每一步要做的事情记录在一个栈里面就可以了

public class Test {

private static void emitStep(int source, int dest) {

System.out.println(source + " - " + dest);

}

static class Step {

Step(int n, int s, int d, int t) {

this.n = n;

source = s;

dest = d;

temp = t;

}

int n, source, dest, temp;

}

private static void hanoi(int n, int source, int dest, int temp) {

java.util.StackStep steps = new java.util.StackStep();

steps.add(new Step(n, source, dest, temp));

while (steps.empty() == false) {

Step step = steps.pop();

if (step.n == 1) {

emitStep(step.source, step.dest);

continue;

}

steps.push(new Step(step.n - 1, step.temp, step.dest, step.source));

steps.push(new Step(1, step.source, step.dest, 0));

steps.push(new Step(step.n - 1, step.source, step.temp, step.dest));

}

}

public static void main(String[] args) {

hanoi(3, 1, 3, 2);

}

}

java 用递归创建二叉树,非递归遍历二叉树输出节点

我自己用递归写了下,不知道能不能给你帮助:

测试类:

package tree;

import java.util.*;

public class Test {

public static void main(String[] args){

ListTree trees=new ArrayListTree();

int id=1;

Tree tree1=new Tree(0,id++,"张三丰");

Tree tree2=new Tree(tree1.getId(),id++,"武当宋大侠宋远桥");

Tree tree3=new Tree(tree1.getId(),id++,"武当俞二侠俞莲舟");

Tree tree4=new Tree(tree1.getId(),id++,"武当俞三侠俞岱岩");

Tree tree5=new Tree(tree1.getId(),id++,"武当张四侠张松溪");

Tree tree6=new Tree(tree1.getId(),id++,"武当张五侠张翠山");

Tree tree7=new Tree(tree1.getId(),id++,"武当殷六侠殷梨亭");

Tree tree8=new Tree(tree1.getId(),id++,"武当莫七侠莫声谷");

Tree tree9=new Tree(tree6.getId(),id++,"明教张无忌");

Tree tree13=new Tree(tree2.getId(),id++,"叛徒宋青书");

Tree tree10=new Tree(0,id++,"任我行");

Tree tree11=new Tree(tree10.getId(),id++,"令狐冲");

Tree tree12=new Tree(tree10.getId(),id++,"任盈盈");

trees.add(tree1);

trees.add(tree2);

trees.add(tree3);

trees.add(tree4);

trees.add(tree5);

trees.add(tree6);

trees.add(tree7);

trees.add(tree8);

trees.add(tree9);

trees.add(tree10);

trees.add(tree11);

trees.add(tree12);

trees.add(tree13);

for(int i=0;itrees.size();i++){

Tree tree=trees.get(i);

if(tree.getParentId()==0){

tree.showChildTree(trees);

}

}

}

}

树类:

package tree;

import java.util.List;

public class Tree {

private int parentId;

private int id;

private String showStr;

private String Spaces="";

public Tree() {

// TODO Auto-generated constructor stub

}

public Tree(int parentId,int id,String showStr){

this.parentId=parentId;

this.id=id;

this.showStr=showStr;

}

public void showChildTree(ListTree trees){

if(parentId!=0){

trees.get(id-1).setSpaces(trees.get(parentId-1).getSpaces()+" ");

}

System.out.println(trees.get(id-1).getSpaces()+showStr);

for(int i=0;itrees.size();i++){

Tree tree=trees.get(i);

if(tree.getParentId()==id){

tree.showChildTree(trees);

}

}

}

public int getParentId() {

return parentId;

}

public void setParentId(int parentId) {

this.parentId = parentId;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getShowStr() {

return showStr;

}

public void setShowStr(String showStr) {

this.showStr = showStr;

}

public String getSpaces() {

return Spaces;

}

public void setSpaces(String spaces) {

Spaces = spaces;

}

}

效果图:

张三丰

武当宋大侠宋远桥

叛徒宋青书

武当俞二侠俞莲舟

武当俞三侠俞岱岩

武当张四侠张松溪

武当张五侠张翠山

明教张无忌

武当殷六侠殷梨亭

武当莫七侠莫声谷

任我行

令狐冲

任盈盈

java树级对象递归查找子集问题

package com.demo.dept;

/**

 * @author dongbin.yu

 * @from 2016-05-06

 * @since V1.0

 */

public class Dept {

    private int id;

    private String name;

    private int parentId;

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public int getParentId() {

        return parentId;

    }

    public void setParentId(int parentId) {

        this.parentId = parentId;

    }

    public Dept(int id, String name, int parentId) {

        this.id = id;

        this.name = name;

        this.parentId = parentId;

    }

}

package com.demo.dept;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

 * @author dongbin.yu

 * @from 2016-05-06

 * @since V1.0

 */

public class DeptTest {

    private static ListDept depts = new ArrayList();

    static{

        depts.add(new Dept(1,"部门1",0));

        depts.add(new Dept(2,"部门2",1));

        depts.add(new Dept(3,"部门3",1));

        depts.add(new Dept(4,"部门4",1));

        depts.add(new Dept(5,"部门5",2));

        depts.add(new Dept(6,"部门6",3));

        depts.add(new Dept(7,"部门7",2));

        depts.add(new Dept(8,"部门8",2));

        depts.add(new Dept(9,"部门9",1));

        depts.add(new Dept(10,"部门10",5));

    }

    public static void main(String[] args) {

        MapInteger, ListInteger deptMap = new HashMap();

        for (Dept dept : depts) {

            deptMap.put(dept.getId(),getChildDept(dept.getId()));

        }

        System.out.println(deptMap);

    }

    private static ListInteger getChildDept(int id){

        ListInteger ids = new ArrayList();

        for (Dept dept : depts) {

            if(dept.getParentId() == id){

                //添加第一次父id符合的

                ids.add(dept.getId());

                //添加嵌套父id符合的

                ids.addAll(getChildDept(dept.getId()));

            }

        }

                Collections.sort(ids);

        return ids;

    }

}