import java.io.*;                 // for I/O

//类名:Params
//属性:
//方法:
class Params //这个类的对象被压入栈中
{
public int n; //用来存放键盘输入的数字
public int returnAddress; //返回的地址 public Params(int nn, int ra)
{
n=nn;
returnAddress=ra;
}
} // end class Params //类名:StackX
//属性:
//方法:
class StackX
{
private int maxSize; // size of StackX array
private Params[] stackArray;
private int top; // top of stack
//--------------------------------------------------------------
public StackX(int s) // constructor
{
maxSize = s; // set array size
stackArray = new Params[maxSize]; // create array
top = -1; // no items yet
}
//--------------------------------------------------------------
public void push(Params p) // put item on top of stack
{
stackArray[++top] = p; // increment top, insert item
}
//--------------------------------------------------------------
public Params pop() // take item from top of stack
{
return stackArray[top--]; // access item, decrement top
}
//--------------------------------------------------------------
public Params peek() // peek at top of stack
{
return stackArray[top];
}
//--------------------------------------------------------------
} // end class StackX //类名:stackTriangle
//属性:
//方法:
class stackTriangle
{
static int theNumber; //用于接收输入的int
static int theAnswer;
static StackX theStack;
static int codePart; //用于switch选择
static Params theseParams; public static void main(String[] args) throws IOException
{
System.out.print("Enter a number: ");
theNumber = getInt(); //接收键盘输入的int
recTriangle();
System.out.println("Triangle="+theAnswer);
} // end main() public static void recTriangle()
{
theStack = new StackX(10000);
codePart = 1;
while( step() == false) // call step() until it's true
; // null statement
}
//-------------------------------------------------------------
public static boolean step()
{
switch(codePart)
{
case 1: // initial call
System.out.println("进入1");
theseParams = new Params(theNumber, 6);
theStack.push(theseParams);
codePart = 2;
break; case 2: // method entry
System.out.println("进入2");
theseParams = theStack.peek(); //对输入的数字一直减1,直到等于1,如果大于1就跳到3中,压入栈中
if(theseParams.n == 1) // n是键盘输入的数字,如果是1,结果是1,codePart跳到5
{
theAnswer = 1;
codePart = 5; // exit
}
else //如果大于1,就跳到3
codePart = 3; // recursive call
break; case 3:
System.out.println("进入3");
Params newParams = new Params(theseParams.n - 1, 4);
theStack.push(newParams); //把输入的数字减去1,并压入栈中
codePart = 2; //回到2中判断数组减去1后,是否等于1
break; case 4: // calculation
System.out.println("进入4");
theseParams = theStack.peek(); //取得2
theAnswer = theAnswer + theseParams.n; //1+2
codePart = 5;
break; case 5: // method exit
System.out.println("进入5");
theseParams = theStack.peek();
codePart = theseParams.returnAddress; //在2和3中交替跳转后,结束时跳到5,此时栈中codePart除了栈底是6,其他都是4
theStack.pop(); //在取得了下次跳转的位置后,出栈,第一次出栈的是(1,4)
break; case 6: // return point
System.out.println("进入6");
return true;
} // end switch
return false;
} // end triangle
//-------------------------------------------------------------
public static String getString() throws IOException
{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
}
//-------------------------------------------------------------
public static int getInt() throws IOException
{
String s = getString();
return Integer.parseInt(s);
} }

Java递归算法——三角数字(消除递归)的更多相关文章

  1. Java递归算法——三角数字

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...

  2. java递归算法实现 数字人民币大写转换

    最近穷死了 ,没钱吃饭ing 写点钱给自己吧!public class Test{ public static String getChar(long a){ int b = (int)a; Map ...

  3. 输出 n=6 的三角数字阵(JAVA基础回顾)

    package itcast.feng; import java.util.Scanner; //需求:输出 n=6 的三角数字阵 //1 //2 3 //4 5 6 //7 8 9 10 //11 ...

  4. Java数据结构和算法之递归

    四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mo ...

  5. Oracle java.sql.SQLException: 数字溢出

    六月 30, 2016 5:47:47 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinit ...

  6. Java 控制台输入数字 输出乘法表(代码练习)

    最近,回忆了一些刚学习Java时经常练习的一些小练习题.感觉还是蛮有趣的,在回顾时想起好多学习时的经历和坎坷,一道小小的练习题要研究半天,珍重过往,直面未来.下面贡献代码,Java 控制台输入数字 输 ...

  7. java开发_数字转换汉语中人民币的大写_完整版

    做这个应用,源于突然的一个想法:看到发票上面的数字要转换成汉语中人民币的大写 于是就有了下面的这些事儿..... 先看看运行效果: ================================== ...

  8. JAVA递归算法及经典递归例子 对于这个汉诺塔问题

    前言:递归(recursion):递归满足2个条件 1)有反复执行的过程(调用自身) 2)有跳出反复执行过程的条件(递归出口) 第一题:汉诺塔 对于这个汉诺塔问题,在写递归时,我们只需要确定两个条件: ...

  9. Java递归算法——阶乘

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...

随机推荐

  1. SQL Server自动化运维系列——关于邮件通知那点事(.Net开发人员的福利)

    需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 邮件作为一种非常便利的预警实现方式,在及时性和易用性 ...

  2. 关于stm32定时器的理解

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 表面意思是输出控制极性为高,但是意思是定时器输入0,不反相,输出0: 输出控制极性为 ...

  3. windows socket编程select模型使用

    int select(         int nfds,            //忽略         fd_ser* readfds,    //指向一个套接字集合,用来检测其可读性       ...

  4. 去掉windows8.1鸡肋的开始按钮

    无开始按钮了,win8.1的 开始按钮反而非常鸡肋.. 可以使用我分享的链接下载startisgone: http://download.csdn.net/detail/wangallan/89728 ...

  5. Ubuntu配置OpenLDAP

    sudo apt-get install slapd ldap-utils sudo dpkg-reconfigure slapd sudo apt-get purge slapd sudo apt- ...

  6. 解密FFmpeg播放track mode控制

    上一篇文章(http://www.cnblogs.com/yangdanny/p/4421130.html)我们解决了在FFmpeg下如何处理H264和AAC的扩展数据,根据解出的NALU长度恢复了H ...

  7. [很郁闷]python2.7连接mysql5.5配置

    前言:今天在公司电脑上python版本跟自己家里电脑上的一样,不一样的是mysql公司版本5.6,结果花了两天的时间都没配置好python和mysql 简单说就是python连接mysql一直报200 ...

  8. [转]ArcIMS 中地图坐标参考设置(ArcGIS Unknown Spatial Reference)

    "ArcGIS Unknown Spatial Reference"问题: shp文件在Arcgis打开后经常因为原有坐标系无法识别而丢失信息,出现以下提示信息: "Un ...

  9. java设计模式之状态模式

    状态模式 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 状态模式UML图 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关 ...

  10. 【2016-10-17】【坚持学习】【Day8】【抽象工厂模式】

    定义: 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类. 结构: 抽象工厂类 具体工厂类 抽象产品类 具体产品类 例子: 代码: interface SkinFactory { B ...