再帰は非常に重要なアイデアとアルゴリズムです。ブルーブリッジカップ、ACM、プログラミングラダーコンペティションなど、大学で非常に人気のあるプログラミングコンペティションを覚えています。再帰を理解するには、3つの文が必要です。
(1)再帰はループです
(2)再帰は常に自分自身を呼び出す方法です
(3)再帰には出口が必要です。メソッドの呼び出しを停止するにはifステートメントが必要です
再帰を説明する3つの簡単な例を示します
3つの例は、出力0〜9、配列の合計、文字列が等しいかどうかの判別です。
3つの例はすべてforループを使用して解決できるため、再帰とループを相互に変換できます。以下のアイデアを分析してみましょう:
最初の質問:出力0-9
先写f1(0,9);这就代表了会输出0-9折10个数;
在f1(int begin, int end)中,我们只打印begin这个数,后面的工作给别人做,这是在“踢皮球”;
当begin>end时,不能打印了,直接return,这是递归的出口
2番目の質問:配列の合計を計算します
先写f2(arr,0);表示从第0位开始计算数组中元素的和
在方法中计算arr[begin]+f2(arr,begin+1);表示我们只计算第0位的元素,后面的计算给别人做,这是“踢皮球”;
当begin等于数组中最后一位时,直接就返回这个位置的值,这是出口
3番目の質問:文字列が等しいかどうかを比較する
先写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);
}
}
したがって、再帰を行うには3つのステップが必要です
(1)重複を見つける:私が作成した部分+他の人のために「ボールをプレーする」部分
(2)変更を見つける:変更は通常、再帰的メソッドのパラメーターです
(3)境界を見つける:境界は一般に再帰出口です
再帰は比較的基本的なトピックに過ぎず、この記事で更新され続けるより深いトピックがあります。