递归

什么叫递归?举一个通俗的例子:
有一个8俩重的苹果要你切成重量相等的若干份,每一份的重量不能大于1俩。你肯定会想到这样做:
1.第一刀先把一个苹果切成重量均等的2份A1和A2;
2.再把其中的一份A1切成重量均等的两份A11和A12, 把A2切成均等的两份A21和A22;
3.把A11切成均等的两份……
4.直到每一小份都小于等于1俩为止。
以上的例子就是递归一个模型,把一个大的事物化成若干个小的事物,每一次使用的方法都相同。
更为专业的定义:
程序自身调用自身的编程技巧称为递归( recursion)。递归有直接递归和间接递归
•直接递归:函数在执行过程中调用本身。
•间接递归:函数在执行过程中调用其它函数再经过这些函数调用本身。
递归有四个特性:
1.必须有可最终达到的终止条件,否则程序将陷入无穷循环;
2.子问题在规模上比原问题小,或更接近终止条件;
3.子问题可通过再次递归调用求解或因满足终止条件而直接求解;
4.子问题的解应能组合为整个问题的解。
 

上面的例子中也满足以上的四点性质:
(1).终止条件是每一份的重量不能大于1俩;(2).每一次切的大小都比上一次小;(3).每一次切的方式都相同,所以子问题可递归调用;(4).最终切成的每一小份也就是要求的解。
 
对上面例子的实现:

public static void sliceApple(float weight, int times){
        if (weight <= 1) {
            //System.out.println("weight:" + weight);
        } else {
            float w = weight / 2;
            System.out.println("第" + times + "次等分的重量为:" + w + "   " + w);
            times += 1;
            sliceApple(w, times);
            sliceApple(w, times);
        }
    }

    public static void main(String args[]) {
        sliceApple(8, 1);
    }

结果:
第1次等分的重量为:4.0   4.0
第2次等分的重量为:2.0   2.0
第3次等分的重量为:1.0   1.0
第3次等分的重量为:1.0   1.0
第2次等分的重量为:2.0   2.0
第3次等分的重量为:1.0   1.0
第3次等分的重量为:1.0   1.0

递归能做什么?将大问题分解成小问题,将复杂的问题简单化;
使程序更易于理解,增强可读性;
你会怎样使用递归?分析问题,看看问题是否属于递归模型,能否用递归模型解决。一个问题能否用递归模型就看它是否满足递归的四个特性。
递归在调用的时候要保存调用点的信息,因此会有调用开销。在对效率有较高要求的时候,如果能用循环解决问题最好不要用递归,因为循环没有调用开销,效率会更高。
 

转载于:https://my.oschina.net/onlrl/blog/683758

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值