(一)概述:
根据面向对象程序设计的思想,对象包括属性(数据)和方法(操作)。其实,递归和循环就相当于两种非常相似的操作,但是它们都有适合自己操作的数据。可以把一个问题看作一个对象,问题由数据(问题没有解决时的状态或数据结构)和操作(把问题解决)组成。根据不同的数据(数据结构——> 问题结构),选择相应的操作,才是合适的选择!
(二)相同点:
1.递归和循环的本质都是代码复用。
2.递归和循环在理论上具有相同的计算能力(在可计算性理论中,这两种计算模型所计算的函数类是相同的)。
3.递归是一种特殊的循环。
(三)不同点:
1.程序独立性
递归由程序和系统共同完成。递归需要系统维护一个系统工作栈。
循环由程序单独完成。但是,循环需要程序设定好循环条件。
2.程序规模
递归的规模很小,受到系统工作栈大小的限制。
循环的规模很大,几乎不会受到限制。
在VS2012中计算1+2+3+······+n
使用递归n只能达到4710.
使用循环n可以达到20 0000 0000.
3.复用单位
递归的复用单位是函数。
循环的复用单位是语句(for循环语句或while循环语句)。
4.解题方向
递归往往是自顶向下(1 <—— n),将问题的规模逐步缩小,直到缩小至递归结束条件成立(n == 1)。
循环既可以是自顶向下(1 <—— n),也可以是自底向上(1 ——> n),但是一般还是自底向上(1 ——> n)的比较多。
5.优缺点
(1)递归的优点:
代码清晰简洁,易于理解,可读性强。
(2)递归的缺点:
运行效率低(函数调用需要参数入 栈和出栈);
对存储空间的占用比循环多,因此受到问题规模和线程空间大小的限制,如果栈溢出,将导致系统崩溃;
不便于调试。
(3)循环的优点:
运行效率高(不需要函数参数入栈和出栈);
对存储空间占用比递归少,不需要系统维护工作栈;
便于调试。
(4)循环的缺点:
一重、二重、三重循环的代码还能接受,四重及以上循环的代码就变得非常难看,可读性很差。
而且有的问题非常适合用递归,用循环实现会非常困难。
6.适用场合
递归适合用在:
数据的结构形式是按照递归定义的,比如单链表,二叉树,斐波那契数列等;
数据的结构形式不是按照递归定义的,但是用递归求解比用循环求解更加简单,比如汉诺塔问题,四重及以上循环问题。
循环适合用在:
数据的结构形式不是按照递归定义的,使用循环就能够轻松解决的问题,比如一重循环、二重循环、三重循环。
(四)结论:
由于循环具有运行效率高,便于调试等优点,因此尽量使用循环。但是,当遇到如上面所示的两种适合递归的问题或者循环很难解决的问题时,就要使用递归。虽然使用递归牺牲了运行效率和存储空间,但是却换来了更加清晰简洁和易于理解的代码,可读性大大提高!