求阶乘和:1!+2!+3!+4!+…+n!
写代码前
看到题目,一开始没思路不要慌~~~
- 先思考,可以把想到的点子都记在本子上;
- 串起来整合,再上手写代码,比直接就写理解更深刻;
- 从而达到巩固知识,举一反三的效果。
说干就干
- 好,我们回归正题,题给要求很简单,求阶乘和。
- 也就是说,我们先得拿到: 数字1-数字n 的阶乘,然后再把:n个数字的阶乘加起来,即得到结果;
- 脑海里搜索回忆以及一番思考后,有三种方法可以解决这道题,以下都写成了方法(也就是函数)形式。
方法一:while循环
【代码1】
import java.util.Scanner;
public class myPractice {
public static int facSum(int n) {
int sum = 0;
int i = 1;
// 外层循环负责求阶乘的和
while (i <= n) {
int facResult = 1;
int j = 1;
// 里层循环负责完成求阶乘的细节
while (j <= i) {
facResult *= j;
j++;
}
i++;
sum += facResult;
}
return sum;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int ret = facSum(n); //方法一
System.out.println(n + " 的阶乘和为:" + ret);
}
}
方法二:for循环
【代码2】
import java.util.Scanner;
public class myPractice {
public static int sumFac(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
int ret = 1;
for (int j = 1; j <= i; j++) {
ret *= j; // ret = ret * j;
}
sum += ret; // sum = sum + ret;
}
return sum;
}
public static void main(String[] args) { // m4
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int ret = sumFac(n); //方法二
System.out.println(n + " 的阶乘和为:" + ret);
}
}
在【代码2】里我们可以发现,while循环 逻辑和 for循环 很相似,但就结构上来说,显而易见 for循环 要更清晰和简洁一些。
方法三:递归
【代码3】
import java.util.Scanner;
public class myPractice {
public static int fac(int n) { //求阶乘
if (n == 1) {
return 1;
}
return n * fac(n - 1);
}
public static int sum(int n) { //求阶乘和
if (n == 1) {
return 1;
}
return fac(n) + sum(n-1);
}
public static void main(String[] args) { // m4
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int ret = sum(n); //方法三
System.out.println(n + " 的阶乘和为:" + ret);
}
}
借助下图可更好地理解 递归求阶乘和,以 n = 3 为例。
最终小结
- 孔子曰:吾日三省吾身、温故而知新。
- 写代码也是,每学一点,巩固之前学过、写过、看过的代码,每当我学习新知识卡住的时候,我往往会回顾一下之前学过得相关的知识,这样,往往会有一些新的理解,我认为这是一个不错的办法。
- BUT,有时候这个过程呢,往往有点煎熬。。以及枯燥=^=
- 正所谓:代码虐我千百遍,我待代码如初恋~~
- 加油!奥利给!