bilibiliJava学习递归

1.递归的概念

一个方法在执行的过程中调用自身,就称为递归

递归相当于数学上的数学归纳法,有一个起始条件,就有一个递推公式。

例如,我们求N!

起始条件:N = 1的时候,N!为1,这个起始条件相当于递归的结束条件。

递推公式:求N!,直接不好求,可以吧问题转换成N! = > N * (N-1)!

例子1:

public class Recusion {
    public static void function(){
        function();
    }

    public static void main(String[] args) {
        function();
    }

}

会得出

Exception in thread "main" java.lang.StackOverflowError错误

这个是栈溢出错误,一般情况去检查递归的终止条件

(1)没有(2)给错了

public class Recusion {
    public static void function(int a){
        if(a == 1){
            System.out.println(a);
            return;
        }
        function(a-1);
        System.out.println(a);

    }

    public static void main(String[] args) {
        function(10);
    }

}

输出1到10

观察:

(1)每次递归的时候,这个方法只执行了一部分,就去执行另一个部分了

(2)归的时候,会把当前方法剩余部分执行完毕

(3)递的次数和归的次数是一样的

例子2:阶乘使用递归执行

public static int fac(int n ){
    if(n == 1){
        return 1;
    }
     int tmp = n * fac(n - 1);
    return tmp;
}

public static void main(String[] args) {
    int ret = fac(9);
    System.out.println(ret);
}

2.按顺序打印数字的每一位

public static void asd(int n){
    if(n < 10){
        System.out.println(n);
        return;
    }
    asd(n / 10);
    System.out.println(n % 10);
}

public static void main(String[] args) {
    asd(598);
}

3.递归求1+2+3+ 。。 + 10

public static int  sum(int num){
    if(num == 1){
        return 1;
    }
    return num + sum(num - 1);
}

4.写一个递归方法,输入一个非负整数,返回组成他们的数字之和

public static int addition(int n){
    if(n < 10){
        return n;
    }
    int tmp = (n % 10) + addition(n / 10);
    return tmp;

5.写一个递归方法,求斐波那契数列的第n项

public class fib {
    public static int fib(int n){
        if(n == 1 || n ==2){
            return 1;
        }
        return fib(n-1) + fib(n - 2);
    }

    public static void main(String[] args) {
        System.out.println(fib(5));
    }
}

6.汉诺塔

import java.util.Scanner;



public class HANIO {
    public static void hanio(int n, double num1, double num2, double num3){
        if(n == 1){
            move(num1, num3);
            return;
        }
        hanio(n-1,num1,num3,num2);
        move(num1,num3);
        hanio(n-1,num2,num1,num3);
    }
    public static void move(double num1, double num2){
        System.out.print(num1 + "->" + num2+" ");
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
         hanio(n,1,2,3);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值