递归算法

来源:互联网 发布:如何搭讪 知乎 编辑:程序博客网 时间:2024/05/22 03:20

概述:

程序调用自身的编程技巧称为递归( recursion)。递归过程一般通过函数或子过程来实现。

递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。

递归有直接递归和间接递归

•直接递归:函数在执行过程中调用本身。
•间接递归:函数在执行过程中调用其它函数再经过这些函数调用本身。
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

实现:

如何设计递归算法:
1.确定递归公式;
2.确定边界条件;
Java例子():
1、累加求和
public static int Acc(int a) {if ( 1 == a) {return a;} else {return Acc(a-1)+a;}}

2、求阶乘
 
public static int factorial(int a) {  if (1 == a) {return a;  }else {return a*factorial(a-1);  }           } 

3、一个人卖汽水,1块钱1瓶汽水,3个瓶盖可以换一瓶汽水,2个空瓶可以换一瓶汽水,问20块钱总共可以买多少瓶汽水
package Exercise;/** * * 一个人卖汽水,1块钱1瓶汽水,3个瓶盖可以换一瓶汽水,2个空瓶可以换一瓶汽水, * 问20块钱总共可以买多少瓶汽水 * @author Eric * */public class Recursion {private static int money      = 20;private static int carbonated = 0;private static int bottle_cap = 0;private static int bottle     = 0;public static void main(String[] args) {Recursion.change();System.out.println(carbonated);}public static void change() {--money ;++carbonated;++bottle_cap;++bottle;if(money > 0) {change();}if(bottle_cap >= 3) {bottle_cap-=3;change();}if (bottle >= 2) {bottle-=2;change();}}}


小结:

递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。
原创粉丝点击