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. IntelliJ IDEA 教程设置讲解

    IntelliJ IDEA 常用设置讲解 说明 IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.Ant.JUnit.CVS整合.代码审查 ...

  2. SQL Server 2008 R2——使用计算列为表创建自定义的自增列

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  3. Euclid求最大公约数

    Euclid求最大公约数算法 #include <stdio.h> int gcd(int x,int y){ while(x!=y){ if(x>y) x=x-y; else y= ...

  4. 64位的Ubuntu系统上使用汇编nasm和C语言

    64位的Ubuntu系统上使用汇编nasm和C语言 $ nasm -f elf foo.asm -o foo.o$ gcc -c bar.c -o bar.o$ ld -s  foo.o bar.o ...

  5. ajax请求成功后新开窗口window.open()被拦截解决方法

    ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是很可惜被浏览器给拦截了,怎么解决这个问题呢   问题: 前面开发项目时碰到一个问题,ajax 异步请求 ...

  6. SSH----小小项目的小小总结

    嘛,之前学了一下SSH框架,跟人合作写了个小东西参加比赛,(当然我是队长),真的感慨良多~,现在用这篇博客记录下来吧 1.责任心/责任感 首先要说的一点,要有责任心,当你与别人组成一个团队的时候,虽然 ...

  7. pycharm的使用破解和Anaconda的使用

    1.pycharm的破解: 版本: pycharm 2016.2.3 链接: 下载专业版本   下面是这个版本的注册码: 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTcz ...

  8. Centos6 服务器病毒查杀命令历史

    top whereis vhowazeclu ll /usr/bin/v* more /usr/bin/vhowazeclu ps aux|grep vhowa ps aux|grep vhowaze ...

  9. java多线程系类:JUC原子类:05之AtomicIntegerFieldUpdater原子类

    概要 AtomicIntegerFieldUpdater, AtomicLongFieldUpdater和AtomicReferenceFieldUpdater这3个修改类的成员的原子类型的原理和用法 ...

  10. Swift之 ? 和 !

    Swift之 ? 和 ! 转载于:http://joeyio.com/ios/2014/06/04/swift---/ Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋 ...