初入Java大门——第五话、递归

递归

递归的概念

递归就是一个方法在执行的过程中调用自身。
例1:求n的阶乘

import java.util.Scanner;
public class Main {
    //这是创建的factor方法
    public static int factor(int n) {
        //当n等于1时,返回值为1
        if(n == 1){
            return 1;
        }
        //当n不等于1时,调用递归
        int ret = n*factor(n - 1);
        //调用递归,此时factor(int n)的n等于(n-1)的值
        return ret;
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入一个整数:");
        //调用Scanner类,创建一个int型变量n来承载从键盘输入的数
        int n = input.nextInt();
        //创建一个factor方法,创建一个int型变量ret来承载fac方法输出的值
        int ret = factor(n);
        //打印输出ret的值
        System.out.println(ret);
    }
}

输出结果

请输入一个整数:5
120

图解:
在这里插入图片描述
按照箭头上的数字序号执行,(1),(2),(3),(4)为递,(5),(6),(7),(8)为归。
当(1)到(3)项,都无法满足终止递归条件,所以一直执行int ret = n * factor(n - 1)语句,继续调用fac方法,每次n的值都等于n - 1。当执行到第(4)项时,n等于1,执行if语句,终止递归,执行第(5)项,factor(2)= ret = 21=2,然后执行第(6)项,factor(3) = ret = 32 = 6,然后返回执行第(7)项,factor(4) = 46 = 24,然后执行factor(5) = ret = 524 = 120.最后执行return ret语句,递归结束。

例1进阶版:
例2:求n的阶乘的前n项和

 import java.util.Scanner;
public class Test {
    //这个方法就是sum方法,求n阶乘的前n项和
    public static int sum(int n) {//n为输入的数字n
        //当n等于1时,终止递归,返回值为1;
        if(n == 1){
            return 1;
        }
        //当n不等于1时返回值为(调用fac方法加递归sum方法,此时n等于n减1)
        return fac(n) + sum(n - 1);
    }
    //下面时fac方法,求n的阶乘
    public static int fac(int a) {//a与输入的数字相等
        //当a等于1时,终止递归,返回值为1
        if(a == 1){
            return 1;
        }
        //当n不等于1时,返回值为a乘递归fac方法,此时等于a减1
        return a * fac(a - 1) ;
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入数字:");
        //输入数字n来表示计算n的阶乘的前n项和
        int n = input.nextInt();
        //sum(n)表示写一个方法来计算n的阶乘的前n项和
        //创建一个int型变量ret来承载方法sum的值
        int ret = sum(n);//调用sum方法
        System.out.println(ret);
    }
}

结果

请输入数字:5
153

递归是一种重要的编程解决方式,有些问题用递归解决起来很容易,如斐波那契数和汉诺塔问题。但是有些问题递归与非递归都能解决时。同等情况下,递归没有非递归高效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值