Java 递归、尾递归、非递归 处理阶乘问题

n!=n*(n-1)!

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * n的阶乘,即n! (n*(n-1)*(n-2)*...1)。

* 0!为什么=1,由于1!=1*0!。所以0!=1
 *
 * @author stone
 * @date   2015-1-6 下午18:48:00
 */
public class FactorialRecursion {

	static long fact(long n) {
		if (n < 0) return 0;
	    else if (n <= 1) return 1;//n == 1 || n == 0
		return n * fact(n - 1); //占用的暂时内存空间随着层级越来越大,直至有直接返回值时。再从底层一路向上返回到顶层
	}

	//假设一个函数的递归形式的调用出如今函数的末尾,则称为 尾递归函数
	static long fact(long n, long lastValue) {//last表示要被相乘的上次求出的数。初始值应为1
		if (n < 0) return 0;
	    else if (n == 0) return 1;
	    else if (n == 1) return lastValue;
		return fact(n - 1, n * lastValue);
	}

	static long str2long(String num) {
		return Long.valueOf(num);
	}

	public static void main(String[] args) throws Exception {
		System.out.println("-----程序開始,请输入要计算的阶乘数值。-----");
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = br.readLine();
		while (!line.equals("exit")) {
			long n = str2long(line);
			System.out.println(fact(n));
			System.out.println(fact(n, 1));
			System.out.println(fact2(n));
			line = br.readLine();
		}
		System.out.println("-----程序退出-----");
		Runtime.getRuntime().exit(0);

	}

	//计算n的阶乘  非递归法
    private static long fact2(long n) throws IllegalAccessException {
        if (n == 1 || n == 0) {
            return 1;
        }
        if (n < 0) {
            throw new IllegalAccessException("參数错误");
        }  

        long sum = 1; // 非递归法
        for (long i = n; i >= 2; i--) {
            sum = sum * i;
        }
        return sum;
    }  

}
-----程序開始,请输入要计算的阶乘数值,-----
1
1
1
1
2
2
2
2
3
6
6
6
4
24
24
24
5
120
120
120
8
40320
40320
40320
exit
-----程序退出-----
时间: 2024-12-18 16:14:26

Java 递归、尾递归、非递归 处理阶乘问题的相关文章

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

JAVA递归、非递归遍历二叉树(转)

原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi

Java数据结构系列之——树(5):二叉树的后序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树后序遍历的递归与非递归实现 * * @author wl * */ public class BitreePostOrder { // 后序遍历的递归实现 public static void biTreePostOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreePostOrderByRe

数据结构二叉树的递归与非递归遍历之 实现可编译(1)java

前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序遍历为例进行说明,中序遍历和后序遍历,以此类推! 二叉树递归与非递归遍历的区别,虽然递归遍历,跟容易读懂,代码量少,运算快,但是却容易出现溢出的问题,所以所以非递归遍历,在处理千万级的运算量时会先的很有用处. 二叉树的先序遍历:先访问根节点,再访问先后访问左右节点.如图: 二叉树的递归遍历之java

二叉树三种遍历递归及非递归实现(Java)

import java.util.Stack; //二叉树三种遍历递归及非递归实现(Java) public class Traverse { /******************定义二叉树**************************/ private final int MAX_SIZE = 10; //链式存储 public static class BinaryTreeNode { int mValue; BinaryTreeNode mLeft; BinaryTreeNode

java扫描文件夹下面的所有文件(递归与非递归实现)

java中扫描指定文件夹下面的所有文件扫描一个文件夹下面的所有文件,因为文件夹的层数没有限制可能多达几十层几百层,通常会采用两种方式来遍历指定文件夹下面的所有文件.递归方式非递归方式(采用队列或者栈实现)下面我就给出两种方式的实现代码,包括了递归与非递归实现,code如下所示. package q.test.filescanner; import java.io.File;import java.util.ArrayList;import java.util.LinkedList; import

递归和非递归分别实现求n的阶乘

思路:举例求6的阶乘,6*5*4*3*2*1.可以将5开始看成另一个整型变量n,用一个循环每次将n的值减少1,.而递归也是如此,每次调用函数的时候将变量减一就可以. 方法一:非递归 1 //非递归: 2 #include<stdio.h> 3 int main() 4 { 5 int num = 1; 6 printf("请输入数字:\n"); 7 scanf("%d",&num); 8 int n = num - 1; 9 while (n &

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void main(String[] args) { // 首先构造叶子节点 BiTree leafA1 = new BiTree(4); BiTree leafA2 = new BiTree(5); BiTree leafB1 = new BiTree(6); BiTree leafB2 = new BiTree(7)

二分查找算法(递归与非递归两种方式)

首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下所示. /* * 非递归二分查找算法 * 参数:整型数组,需要比较的数. */ public static int binarySearch(Integer[]srcArray,int des){ //第一个位置. int low=0; //最高位置.数组长度-1,因为下标是从0开始的. int h