递归算法

递归: 自己调用自己的编程思想


  • 需要递归的数据项只有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);
        }

    }



}


你可能感兴趣的:(递归算法)