目录
练习三(1):按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
练习三(2):求一个数字的每一位加起来的和(例如 1234 的和为1+2+3+4=10)
练习三(3):递归求 1 + 2 + 3 + ... + 10
public static 返回值类型 方法名(形式参数列表){
方法体;
}
例如:用函数的方法实现 计算1-n的阶乘的和
- public class TestDemo {
- //求每个数的阶乘
- public static int fac(int i){
- int ret = 1;
- for (int j = 1; j <= i; j++) {
- ret *= j;
- }
- return ret;
- }
- //求阶乘和
- public static int sum(int n){
- int sum = 0;
- for (int i = 1; i <= n; i++) {
- sum += fac(i);
- }
- return sum;
-
- }
- public static void main(String[] args) {
- //用函数实现1-n的阶乘的和。
-
- Scanner scan = new Scanner(System.in);
- int n = scan.nextInt();
- System.out.println(sum(n));
- scan.close();
- }
- }
会有面试题:重载和重写有什么区别?
方法的重载需要满足三个点:

一个方法在执行过程中调用自身, 就称为 "递归"。递归,有递有归。
递归出现栈溢出错误:去检查递归条件,要么给错了,要么没有。
要找到递归的终止条件和递归公式
函数void类型声明代表“无返回值”,但不是“无返回”。所以用return; 返回是可以的。 当然,若函数是执行完自动返回,就不需要用return; 了。 有时候我们需要在函数内部强行终止函数继续运行下面的语句,比如说当我们使用一些分支判断的时候,经常需要在特定的情况下返回,终止继续往下运行,此时就需要return了,格式是: return; 这种写法就是有返回但没返回值,符合void。
通过练习理解递归
- public class TestDemo {
- /* 我给的数是3,用递归打印1-3的数字
- 递归的终止条件:a = 1
- 递归公式:每次减1,直到为1,然后就可以归了。
- */
- public static void print(int n){
- if(n == 1){
- System.out.println(n);
- return;
- }
- print(n-1);
- System.out.println(n);
-
- }
-
- public static void main(String[] args) {
- print(3);
- }
- }
1. 每次递的时候,这个方法(print)只执行了一部分,就去执行另一部分了。
2. 归的时候,才会将当前方法的剩余部分执行完毕。
3. 递的次数和归的次数是一样的。

- public class TestDemo {
- /*求n的阶乘
- * 终止条件:n = 1
- * 递归公式: n! = n*(n-1)!*/
- public static int print2(int n){
- if(n == 1){
- return 1;
- }else{
- return n * print2(n-1);
- }
- }
- public static void main(String[] args) {
- System.out.println( print2(5));
- }
- }
学解决问题的思路!!!
- public class TestDemo {
- /*按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
- *首先,要得到每一位数字,%10后 /10
- * 终止条件:n会一直变小,当n等于0时
- *递归公式:n/10 ,得到每一位是 n%10*/
- public static void print3(int n){
- if(n == 0){
- return;
- }
- print3(n/10);
- System.out.print(n%10+" ");
- }
- public static void main(String[] args) {
- print3(1234);
- }
- }
- public class TestDemo {
- /*需要将每位数字加起来
- * 求1234的和 = 4+123的和 */
- public static int print4(int n){
- if(n == 0){
- return 0;
- }
- return print4(n/10) + n%10;
-
- }
- public static void main(String[] args) {
- System.out.println(print4(1234));
- }
- }
- public class TestDemo {
- //递归求 1 + 2 + 3 + ... + 10
- /*输入10,则求1-10的和。
- * 终止条件:n = 1
- * 递归公式:1-10的和 = 10 + 1-9的和。每次-1的值返回与前面的值相加*/
- public static int sum(int n){
- if(n == 1){
- return 1;
- }else{
- return sum(n-1)+n;
- }
- }
- public static void main(String[] args) {
- System.out.println(sum(10));
- }
- }
面试时遇到让求斐波那契数列的第 N 项用循环做,别用递归。递归效率低。
- public class TestDemo {
- //求斐波那契数列的第 N 项
- /*递归:
- 终止条件:n = 1,和 n = 2时,返回1
- 递归公式:fib(n) = fib(n-1)+fib(n-2)
- */
- public static int fib(int n){
- if(n<=2){
- return 1;
- }else{
- return fib(n-1)+fib(n-2);
- }
- }
- public static void main(String[] args) {
- System.out.println(fib(10));
- }
- }
- public class TestDemo {
- //求斐波那契数列的第 N 项
- /*非递归
- * 需要a,b,c三个变量,c = a+b
- * 变量还需进行交换*/
- public static void main(String[] args) {
- int n = 10;
- int a = 1;
- int b = 1;
- int c = 1;
- while(n>2){
- c = a + b;
- a = b;
- b = c;
- n--;
- }
- System.out.println(c);
-
- }
- }