递归最好最全的理解方法 首先要划分好递归的三大要素,只要是递归,都要从三大要素入手 第一要素 :首先你要明确这个函数想要干什么 对于递归,我觉得很重要的一个事就是,这个
递归最好最全的理解方法
首先要划分好递归的三大要素,只要是递归,都要从三大要素入手
第一要素:首先你要明确这个函数想要干什么
对于递归,我觉得很重要的一个事就是,这个函数的功能是什么,他要完成什么样的一件事,而这个是完全由你个人来定义的。也就是说我们先不管函数里面的代码是什么,而是要先明白,你这个函数是要干什么。
例如
//用递归算出阶乘public static int f(int n) {}
这个函数的功能是算阶乘。那么,我们定义了一个函数,并且定义了它的功能是什么。接下来我们来看第二要素
第二要素:寻找递归的结束条件
所谓递归,就是会在函数内部代码中,调用这个函数本身,所以,我们必须找出递归的结束条件,不然的话会一直调用自己,进入死循环。也就是说我们需要找出当参数为啥时,递归结束,之后直接把结果返回,请注意,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。
例如,上面那个例子,当n = 1时,f(1)=1。再把第二要素加入代码中
public static int f(int n) {if(n==1){
return 1;
}
}
第三要素:找出函数的等价关系式
我们要不断的缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。
例如f(n)这个范围比较大,我们可以让f(n)=n*f(n-1)。这样,范围就由n变成了n-1,范围变小了,并且为了原函数f(n)不变,我们需要让f(n-1)乘以n。
说白了,就是要找到原函数的一个等价关系式,f(n)的等价关系式为n*f(n-1)即
f(n) = n* f(n-1)。 第三要素是三要素中最难的一步,只要找到关系式离成功就不远了
那么将这个等价式写入函数里
public static int f(int n) {if(n==1){
return 1;
}
return f(n-1) * n;
}
到此为止 递归的阶乘已经结束 可以在main方法中调用f方法来输出你想要的数
public class ResusionDemo1 {public static void main(String[] args) {
System.out.println(f(3));
}
public static int f(int n) {
if (n == 1) {
return 1;
} else {
return f(n - 1) * n;
}
}
//当n等于3 那么输出结果就是6