Java算法

一、递归与循环

  • 理论上任何的循环都可以改写为递归的形式。
    • 有时候因为栈的限制,需要“尾递归”(C可以用goto语句模拟尾递归);
    • java不支持尾递归。
  • 有些语言没有循环语句,只能使用递归(LISP)。

循环改递归的关键

  • 发现循环的逻辑相似性。
  • 不要忘记递归“出口”。

以下是一个简单循环改造成递归的例子:

 1 /**
 2  * 采用循环的方式打印0~n
 3  */
 4 private static void print1(int n) {
 5 
 6     for (int i = 0; i <= n; i++)
 7         System.out.print(i + "\t");
 8 }
 9 
10 /**
11  * 打印从0到n【第一种递归方式】
12  */
13 private static void print2(int n) {
14 
15     if (n > 0){
16         print2(n - 1); // 打印0~n-1
17     }
18     System.out.print(n + "\t"); // 打印n
19 }
20 
21 /**
22  * 从begin打印到end【第二种递归方式】
23  */
24 private static void print3(int start, int end) {
25 
26     if (start > end)
27         return;
28     System.out.print(start + "\t");    // 打印start
29     print3(start + 1, end);            // 打印start+1~end
30 }

  在第一种递归方式中,我们实际上应用到了“分治算法”,将问题分解为两部分:①打印0~n-1(递归处理);②打印n(可以直接处理),先是处理的n;思考:是否可以先处理前面的内容?如果递归方法的参数仍然只有一个参数:我们首先应该处理打印0,由于没有一个相似的结构,我们无法进行下一次的递归操作——我们可以给打印方法增加一个参数(让它从start打印到end),那么该问题就可以分解为:①打印start(直接处理);②打印start+1~end(递归处理)。

  关于递归出口处理

  我们可以在满足条件的时候递归(以上代码的第一种递归方式),或者在不满足条件的时候使用return语句(以上代码的第二种递归方式)。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。