1.阶乘

需求说明:

编写Java程序,输入一个数字,实现该数字阶乘的计算。一个数字的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n! 。例如,5的阶乘等于12345,表示为5! = 120。

JAVA中阶乘 java 阶乘_递推

实现思路:
声明变量fac、i和num,用于存储阶乘运算结果、循环变量以及用户输入的数字。

通过System.out.println()接收用户输入的数字,并为变量num赋值。

根据阶乘计算规则,使用while循环结构实现计算。

使用System.out.println ()实现格式化输出运算结果。

循环条件:! <= num
循环操作:
        fac *= i;
        i++;

实现代码:

import java.util.Scanner;
 
public class kkk {
 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int fac = 1;	//数字的阶乘运算结果
		int i = 1;		//循环变量
		int num;		//用户输入的数字
		//接收用户输入的数字
		System.out.println("请输入一个数字(1~10之间)");
		num = sc.nextInt();
		//计算该数字的阶乘
		while(i <= num) {
			fac *=i;
			i++;
		}
		System.out.println("数字"+num+"的阶乘:"+fac);
	}
}

2.递归

递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。

能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。

【问题】编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。

斐波那契数列为:0、1、1、2、3、……,即:

fib(0)=0;
fib(1)=1;
fib(n)=fib(n-1)+fib(n-2)(当n>1时)。

写成递归函数有:

int fib(intn){
	if(n==0)return0;
	if(n==1)return1;
	if(n>1) 
	returnfib(n-1)+fib(n-2);
}

递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。

在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。

在编写递归函数时要注意,函数中的局部变量和参数知识局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。

由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。