Java递归算法——三角数字(递归和非递归)

 1.递归法

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

public class triangle_demo {
	
	//static int theNumber;
	
	public static void main(String[] args) throws Exception{
		// TODO 自动生成的方法存根
		System.out.println("输入数字:");
		int theNumber = getInt();
		int theAnswer = triangle(theNumber); 
		System.out.println("三角上每一行的数量:"+theAnswer);
	}
	
	public static int triangle(int n){		//递归输出1 3 6 10....
		if(n==1)
			return 1;
		else
			return (n + triangle(n-1));
	}
	
	
	//输出方法
	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);
		
	}

}

 

2.非递归法

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

class Params     //这个类的对象被压入栈中
   {
   public int n;							//用来存放键盘输入的数字
   public int returnAddress;	//返回的地址

   public Params(int nn, int ra)
      {
      n=nn;
      returnAddress=ra;
      }
   }  // end class Params

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

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);
      }

   }  

 

posted @ 2016-04-05 23:51  tonglin0325  阅读(416)  评论(0编辑  收藏  举报