递归是一种很重要的思想和算法,我记得大学中很流行的编程比赛,比如蓝桥杯、ACM、程序设计天梯赛等等,很多题目都可以使用递归来求解。理解递归需要三句话:
(1)递归就是循环
(2)递归就是一个方法不断的调用自己
(3)递归需要一个出口,必须有if语句停止方法的调用
下面用三个简单的例子来说明一下递归
三个例子分别是输出0-9;对数组求和;判断字符串是否相等。
这三个例子都可以很好的使用for循环来解决,所以说递归和循环可以相互转化。下面分析一下思路:
对于第一题:输出0-9
先写f1(0,9);这就代表了会输出0-9折10个数;
在f1(int begin, int end)中,我们只打印begin这个数,后面的工作给别人做,这是在“踢皮球”;
当begin>end时,不能打印了,直接return,这是递归的出口
对于第二题:计算数组的和
先写f2(arr,0);表示从第0位开始计算数组中元素的和
在方法中计算arr[begin]+f2(arr,begin+1);表示我们只计算第0位的元素,后面的计算给别人做,这是“踢皮球”;
当begin等于数组中最后一位时,直接就返回这个位置的值,这是出口
对于第三题:比较字符串是否相等
先写f3(str1, str2);表示比较str1和str2是否相同;
方法体中先比较字符串长度是否一样,不一样直接false,我们只比较第一个字母。后面的字母给别人比,这是“踢皮球”;
当比较到最后,字符串为空时那么字符串相同,这是出口
package com.note;
public class 递归和循环 {
public static void main(String[] args) {
//例1 从0输出到9
f1(0,9);
System.out.println("************************");
//例2 对数组求和
int[] arr = new int[]{1, 3, 5, 7, 8};
int sum = f2(arr,0);
System.out.println("sum:"+sum);
System.out.println("************************");
//例3 比较2个字符串是否相同
String str1 = "abcd";
String str2 = "abcd";
boolean flag = f3(str1, str2);
System.out.println("flag:"+flag);
}
private static boolean f3(String str1, String str2) {
if (str1.length() != str2.length()) return false;
if (str1.length() == 0) return true;
if (str1.charAt(0) != str2.charAt(0)) return false;
return f3(str1.substring(1), str2.substring(1));
}
private static int f2(int[] arr, int begin) {
if (begin == arr.length-1) return arr[begin];
return arr[begin]+f2(arr,begin+1);
}
private static void f1(int begin, int end) {
if (begin > end) return;
System.out.println(begin);
f1(begin+1, end);
}
}
所以,做好递归需要三步
(1)找重复:我做的部分+“踢皮球”给别人做的部分
(2)找变化:变化的通常是递归方法的参数
(3)找边界:边界一般是递归的出口
关于递归这只是比较基础的题目,还有更加深层的题目之后会继续在这篇文章下更新。