递归新理解

很简单的一个问题,

给定一个整数,要求对这个整数从大位数向小位数按顺序输出。

假定这个数是345,我们来分析一下下面这个程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class N {
//n=345,f(345)调用f(34),f(34)调用f(3),执行1
//回递,执行f(34)时的2语句
//执行f(345)时的2语句
void f(int n){
if(n<10) {
System.out.println(n); //1
}
else
{
f(n/10); //345
System.out.println(n%10); //2
}
}
public static void main(String[] args) {
new N().f(345);
}
}

分析回递层之间的关系:f(3)执行完1语句后,递归向上返回到f(34),而f(34)f(3)的关系是:

1
2
3
f(34) {
f(3), sout<<n%10//所以输出了4;
}

同样地,对于f(345),也有:

1
2
3
4
5
6
7
8
9
10
11
f(345) {  
f(34) , sout<<5 ;
}
=>>
f(345){
{ f(3) , sout<<4 } ,sout<<5 ;
}
=>>
f(345){
sout<<3 , sout<<4, sout<<5 ; //所以结果是先输出3,再输出4,最后输出5
};

在做题的时候,你可以把这种递归调用的形式用自上而下的形式写出来,然后再分别找每一层与下面一层的关系,以及找到各层(每个被递归的函数)都做了什么。这样就对递归函数的执行有了更直观、深入的了解。

当然,了解递归的原理,还是要从内存的角度去理解的,这里只是记下分析递归的一个小的技巧。

不要投钱给我
0%