Java方法递归(含详解)

方法递归

递归很熟悉了,我们再来谈谈递归。

定义: 一个方法在执行过程中调用自身, 就称为 “递归”.

递归,相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式. 例如, 我们求 N! 起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.

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

举例:

1.递归求 N 的阶乘
class FactorialSum{
    public int factorialsum(int x){
        if(x==1){
            return 1;
        }
        return x*factorialsum(x-1);
    }
}

这里分析一下这个吧:

class FactorialSum{
    public int factorialsum(int x){
        System.out.println("函数开始, x = " + x); 
        if(x==1){
            return 1;
        }
        int ret=x*factorialsum(x-1);
        System.out.println("函数结束, x = " + x + " ret = " + ret); 
        return ret;
    }
}

运行结果:
在这里插入图片描述在这里插入图片描述如图:一层一层的深入,直到x值等于1,return ret的值就为1,
返回上一层,ret=21,返回ret=2;
返回上一层,ret=3
2,返回ret=6;
返回上一层,ret=46,返回ret=24;
返回最后一层,ret=5
24,返回ret=120;

2.递归求 1 + 2 + 3 + … + 10
class SequenceSum{
    public int sequencesum(int x){
        if(x==1){
            return 1;
        }
        return x+sequencesum(x-1);
    }
}

这样理解,终止条件为 1,如果到1了就返回上一层,那么;
10 !=1 进入10+sequencesum(9);
9 !=1 进入9+sequencesum(8);
.
.
.
1==1 返回上一层,并且sequensum(1)=1 (ps:最深层次);
开始返回上一层
1+2=3 返回上一层 ,并且sequensum(2)=3
.
.
.
10+sequencesum(9)=10+45=55
返回 55

3.按顺序打印一个数字的每一位
class SequencePrint{
    public void sequenceprint(int x){
        if(x>9){
            sequenceprint(x/10);
        }
        System.out.println(x%10);
    }
}

这里我输入的是1234;
1234>9 进入sequence(1234/10)=sequence(123);
123>9 进入sequence(123/10)=sequence(12);
12>9 进入sequence(12/10)=sequence(1);
1<9 Sysout(1%10) 即1,并返回上一层;
Sysout(12%10) 即2,并返回上一层;
Sysout(123%10) 即3,并返回上一层;
Sysout(1234%10) 即4,结束。

4.写一个递归方法,输入一个非负整数,返回组成它的数字之和.
class SequenceNumSum{
        public int sequencenumsum(int x){
            if(x<10){
               return x;
            }
           
            return x%10+sequencenumsum(x/10);
        }
    }

很简单,输入1234
1234>10 return 4+sequencenumsum(123);
123>10 return 3+sequencenumsum(12);
12>10 return 2+sequencenumsum(1);
1<10 return 1;
返回 2+1 返回3;
返回 3+3 返回6;
返回 4+6 返回10 结束

递归有点像盗梦空间,必须一层一层的依次深入,回退的话也是一层一层的倒退,不能瞎**跳,梦中梦,递中递,好好理解吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章