[Java]函数求阶乘n!(factorial)(四种方法)

1. 引言

实现阶乘的方法很多,这边介绍三种方法,分别是递归,尾递归,循环和BigDecimal

2. 代码

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Alogrithm a = new Alogrithm1();
		a.fact(5);
		a.print(a.factN(6));
		a.print(a.factFor(7));
	}
}

class Alogrithm{

	void fact(int n){
		fact_inter(n,1);
	}

	int fact_inter(int n, int product){
		if(n == 1 || n == 0){
			System.out.println("step n=" + n +" value:"+product);
			return 1*product;
		}else{
			System.out.println("step n=" + n +" value:"+product);
			return fact_inter((n-1),n*product);
		}
	}

	int factN(int n){
		if(n == 1 || n==0){
			return 1;
		}else{
			return n*factN(n - 1);
		}
	}

	 int factFor(int n){
		int sum = 1;

		if(n == 0){
			return 1;
		}
		for(int i = 1; i <= n; i++){
			sum*=i;
		}
		return sum;
	}

	  void print(int x){
		System.out.println("x=" + x);
	}
}

3. 输出

step n=5 value:1
step n=4 value:5
step n=3 value:20
step n=2 value:60
step n=1 value:120
x=720
x=5040

4. 说明

int类型的输出 n只能支持到12,在12-33的数值会得到错误的输出值可能正数可能负数,34及以上输出0.

long类型的输出 n只能支持到20,在20-65的数值会得到错误的输出值可能正数可能负数,36及以上输出0.

5.牛逼的BigDecimal来了

修改下上面的部分代码如下:


public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Alogrithm a = new Alogrithm1();
		a.fact(5);
		a.print(a.factN(6));
		a.print(a.factFor(7));

a.print(a.factBig(100));
a.print(a.factBig(1000));

	}
}
//BigDecimal的递归方法,其它两种方式把int替换成BigDecimal处理也等价
         public BigDecimal factBig(int n){

			if(n == 1 || n==0){
				return BigDecimal.valueOf(1);
			}else{
				return BigDecimal.valueOf(n).multiply(factBig(n - 1));
			}

	 }
//修改输出
	void print(Object x){
		System.out.println("x=" + x.toString());
	}  

这样子n的值就可以很大了,不受int和long的长度限制了。  

时间: 2024-08-24 12:48:09

[Java]函数求阶乘n!(factorial)(四种方法)的相关文章

解析Xml四种方法

关键字:Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath [引言] 目前在Java中用于解析XML的技术很多,主流的有DOM.SAX.JDOM.DOM4j,下文主要介绍这4种解析XML文档技术的使用.优缺点及性能测试. 一.[基础知识——扫盲] sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无法解析xml文档的:jaxp只是api,它进一步封装了sax.dom两种接口,并且提供了DomcumentBuilderFa

详解Java解析XML的四种方法

(1)DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取 和操作文档的任意部分,是W3C的官方标准 [优点] ①允许应用程序对数据和结构做出更改. ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据. [缺点] ①通常需要加载整个XML文档来构造层次结构,消耗资源大. [解析详解] ①构建Document对象: DocumentBuilderFactory dbf = DocumentBu

【Java必修课】通过Value获取Map中的键值Key的四种方法

1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value值,求Key值. 本文将用实例介绍四种方法,通过传入Value值,获取得到Key值. 2 四种方法 2.1 循环法 循环法就是通过遍历Map里的Entry,一个个比较,把符合条件的找出来.会有三种情况: (1)找到一个值 (2)找到多个值 (3)找不到 具体代码如下: @Test public void lo

java中定时器的四种方法

1 package com.lid; 2 3 import java.util.Calendar; 4 import java.util.Date; 5 import java.util.Timer; 6 import java.util.TimerTask; 7 8 public class Test { 9 public static void main(String[] args) { 10 //timer1(); 11 timer2(); 12 //timer3(); 13 //time

【转】Java中字符串中子串的查找共有四种方法(indexof())

原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引. 3.int lastIndexOf(String st

javascript中定义声明函数的四种方法

javascript中定义声明函数的四种方法 :http://blog.163.com/zzf_fly/blog/static/209589158201286104927248/ 方法一:function functionName([parameters]){functionBody}; 方法二:将一个未命名的函数function赋给一个指定变量(var):var add=function(a, b){} 方法三:使用new运算符声明函数varName=new Function([param1N

JAVA实现单例模式的四种方法和一些特点

JAVA实现单例模式的四种方法和一些特点,需要的朋友可以参考一下 一.饿汉式单例类 复制代码 代码如下: public class Singleton  {      private Singleton(){ } private static Singleton instance = new Singleton(); private static Singleton getInstance(){          return instance;      }  } 特点:饿汉式提前实例化,没有

两个变量交换的四种方法(Java)

对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) class TestEV//创建一个类{ public static void main(String[]args) { int x =5,y=10; //定义两个变量 int temp = x; //定义第三临时变量temp并提取x值 x = y; //把y的值赋给x y = temp; //然后把临时变量temp值赋给y System.out.println("x=&

Java中字符串中子串的查找共有四种方法(indexof())

Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引. 3.int lastIndexOf(String str) :返回在此字符串中最右边出现的指定子字符串的索引. 4.int las