二、递归简论-算法

来源:互联网 发布:mac netbeans tomcat 编辑:程序博客网 时间:2024/06/05 08:22

简单定义

1. 当一个函数用它自身来定义的时候就称为递归。

例如:f(x)=2f(x1)+x2,f(x)=0

//java实现public static int fx(int x){        if(x == 0) return 0;        else return 2*fx(x-1) + x * x;}

if(x == 0) return 0;定义了基准情况:这个时候的值可以直接算出,不用递归。若没有这行,则这个函数是没有意义的,将一直没有结果。

//错误的示例public static int errRecur_test(int x){        if( x == 0) return 0;        return errRecur_test(x / 3 +1);}

当输入3errRecur_test(2)errRecur_test(3)errRecur_test(2),一直循环下去。程序卡死。

2.小点总结

递归的前两个基本法则
- 基准情形(base case) 要有基准情形,不用递归就能求解。
- 不断推进(making progress) 递归调用总能够朝着基准情形推进。

3.示例

有一个正整数77862,用递归将其每位逐个打印到控制台

思路:先打印7786,再打印2。想打印7786,就先打印778,再打印6。如此循环,当想打印的是个位数(<10)时,就直接打印,就是基准情况了。看下实现。

public static void printInteger(int i){    //如果i >= 10 接着调用printInteger将前面的数字打印出来    if(i >= 10) printInteger(i / 10);    //打印最后一位    //System.out.println(i % 10);    //%运算是比较耗时的    System.out.println(i - i / 10 *10);}

4.递归的第三、四个法则

  • 设计法则(design rule) 假设所有的递归都能运行。
  • 合成效益 在求解一个问题的同一实例时,切勿在不同 的递归调用中做重复性的工作(之后介绍)。
0 0
原创粉丝点击