递归问题:判断某个字串是否是回文

回文是指正着读和反着读都一样的句子,例如“我是谁是我”。

 

递归算法的核心是通过“自己调用自己”将问题规模不断缩减以解决问题。

为此,递归算法首先最终要的是要有判断结束条件,这是易错点,类似循环中防止无限循环。为解决这个问题通常需要一个控制递归终结的变量,在递归过程中不断改变它的值以达到终结条件,因此该值通常作为函数参数。

回文问题的算法描述如下:

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     }

 

posted on 2019-09-24 17:19  pjhhh  阅读(270)  评论(0编辑  收藏  举报