• Java 递归、尾递归、非递归、栈 处理 三角数问题



    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    //1,3,6,10,15...n  三角数
    /*
     * #			1
     * ##			1+2
     * ###			1+2+3
     * ####			1+2+3+4
     * #####		1+2+3+4+5
     * ...第1层为1。 第n层等于  n + (f(n-1))
     */
    public class TriangleNumber {
    	
    	static int triangle(int n) {
    		if (n < 1) return 0;
    		if (n == 1) return 1;
    		return n + triangle(n - 1); //递归到里层计算,从最底层递归向上返回结果并与n计算和
    	}
    	
    	//假设一个函数的递归形式的调用出如今函数的末尾。则称为 尾递归函数
    	static int triangle(int n, int last) {//last初始传0   尾递归
    		if (n < 1) return 0;
    		if (n == 1) return 1 + last;
    		return triangle(n - 1, n + last); //递归到里层,最底层直接算好终于结果并返回,
    	}
    	
    	//非递归
    	static int triangle2(int n) {
    		int sum = 0;
    		for (int i = 1; i <= n; i++) {
    			sum += i;
    		}
    		return sum;
    	}
    	
    	static int str2Int(String num) {
    		return Integer.valueOf(num);
    	}
    	
    	//栈保存处理步骤.  这里就是保存 计算过程的 每一步骤 的值
    	private static class MyStack {
    		int maxSize;
    		int[] stackAry;
    		int top; //栈顶的索引 
    		MyStack(int max) {
    		  this.maxSize = max;
    		  this.stackAry = new int[maxSize];
    		  top = -1;
    		}
    		
    		void push(int n) {
    			stackAry[++top] = n;
    		}
    		
    		int pop() {
    			return stackAry[top--];
    		}
    		
    		int peek() {
    			return stackAry[top];
    		}
    		
    		boolean isEmpty() {
    			return top == -1;
    		}
    	}
    	
    	//使用栈 实现
    	static int triangle3(int n) {
    		MyStack stack = new MyStack(n);
    		int result = 0;
    		while (n > 0) {
    			stack.push(n);
    			n--;
    		}
    		while (!stack.isEmpty()) {
    			int temp = stack.pop();
    			result += temp;
    		}
    		return result;
    	}
    	
    	public static void main(String[] args) throws Exception {
    		System.out.println("-----程序開始,要计算第多少位的三角数值,请输入位数数字 (输入exit结束程序)-----");
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		String line = br.readLine();
    		while (!line.equals("exit")) {
    			int n = str2Int(line);
    			System.out.println("递归:" + triangle(n));
    			System.out.println("尾递归:" + triangle(n, 0));
    			System.out.println("非递归:" + triangle2(n));
    			System.out.println("栈实现:" + triangle3(n));
    			System.out.println();
    			
    			System.out.println("-----程序開始,要计算第多少位的三角数值,请输入位数数字 (输入exit结束程序)-----");
    			line = br.readLine();
    		}
    		System.out.println("-----程序退出-----");
    		Runtime.getRuntime().exit(0);
    		
    	}
    }
    

    test

    -----程序開始。要计算第多少位的三角数值,请输入位数数字 (输入exit结束程序)-----
    10
    递归:55
    尾递归:55
    非递归:55
    栈实现:55
    
    -----程序開始,要计算第多少位的三角数值,请输入位数数字 (输入exit结束程序)-----
    100
    递归:5050
    尾递归:5050
    非递归:5050
    栈实现:5050
    
    -----程序開始,要计算第多少位的三角数值,请输入位数数字 (输入exit结束程序)-----
    exit
    -----程序退出-----





  • 相关阅读:
    窗口和消息
    输出文字
    《windows程序设计》第一章,建议想学API的每天看一章
    hdu 1008为何不对?求大神指导!
    课程设计(物体类),图片可能没有加载出来,自己运行一下就行了
    二叉树前序、中序、后序遍历相互求法
    哈希表工作原理
    c++中关于static关键字的问题
    Halcon学习笔记之缺陷检测(二)
    Halcon学习笔记之缺陷检测(一)
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6916177.html
Copyright © 2020-2023  润新知