递归: 自己调用自己的编程思想
- 需要递归的数据项只有0个,特殊处理一波
- 需要递归的数据项只有1个,特殊处理一波
- 多个数据,注意递归的结束控制
递归注意栈溢出:堆中实体数据世界,栈中引用世界
递归消耗很大,能不用则不用,个人观点
可执行函数组成: 代码段、静态数据区、堆、栈;
尾递归
新的递归函数的返回值覆盖旧的递归函数返回值
package main.java.java数据结构与算法第一课;
public class DG_1 {
public static void main(String[] args) {
System.out.println(dg(5,1));
System.out.println("=========");
// System.out.println(tdg(5));
}
static int i = 1;
public static int tdg(int x) {
if ( x == 1 ) {
return 1;
}else{
System.out.println("x : " + x );
/**
* tdg递归函数在运用递归的时候,会在栈中迭代加载完函数,然后通过弹栈操作,逐个计算
* 结果,最后返回结果
* 存在问题: 导致栈的深度过深,存在空间消耗和浪费,同时函数入栈堆叠,想拿到最终结果需要栈把
* 所有函数引用调用完成,时间消耗多
*/
return x*tdg(x-1);
}
}
public static int dg(int x , int tmp ) {
if ( x == 1 ) {
return tmp;
}else{
System.out.println("tmp :" + tmp + " x : " + x);
/**
* 这里只是调用了函数本身,递归思想仍然在,但是,在函数栈中,新的函数会记录上个函数的值到tmp中
* 栈中存在的函数栈引用无,每个函数调用后都会把自己占用的空间释放
* 尾递归的调用链上可以做到只有一个函数在使用栈,因此可以无限地调用!
*/
return dg(x-1,x*tmp);
}
}
}