回文是指正着读和反着读都一样的句子,例如“我是谁是我”。
递归算法的核心是通过“自己调用自己”将问题规模不断缩减以解决问题。
为此,递归算法首先最终要的是要有判断结束条件,这是易错点,类似循环中防止无限循环。为解决这个问题通常需要一个控制递归终结的变量,在递归过程中不断改变它的值以达到终结条件,因此该值通常作为函数参数。
回文问题的算法描述如下:
1、若字符串中只有一个或零个字符即是回文。
2、若字符串的首尾字符相同则保留并去掉首尾再次判断,否则排除。
由此得到源码:
1 import java.util.Scanner;
2
3 public class Palindrome {
4
5 public static void palJudge(String str,int n)
6 {
7 String temp="";
8 if(n<2)
9 System.out.println("true");
10 else
11 {
12 if(str.charAt(0)==str.charAt(str.length()-1))
13 {
14 for(int i=1;i<(str.length()-1);i++)
15 {
16 temp += str.charAt(i);
17 }
18 palJudge(temp,n-2);
19 } else {
20 System.out.println("false");
21 }
22 }
23 }
24
25 public static void main(String[] args) {
26 String str;
27 Scanner in = new Scanner(System.in);
28 str = in.next();
29 palJudge(str, str.length());
30 }
31
32 }
知识兔得到的结果如下:
改进:
该算法有一个很明显的缺陷就是在递归函数中存在for循环,因此每次递归都要进行一次for循环,致使程序效率低下,而通过控制字符串下标可以规避这个问题,可以将palJudge函数修改为如下:
1 public static void palJudge(String str,int n)
2 {
3 String temp="";
4 if(n<2)
5 System.out.println("true");
6 else
7 {
8 if(str.charAt(n)==str.charAt(str.length()-1-n))
9 {
10 palJudge(str,--n);
11 } else {
12 System.out.println("false");
13 }
14 }
15 }
知识兔