递归问题:判断某个字串是否是回文
回文是指正着读和反着读都一样的句子,例如“我是谁是我”。
递归算法的核心是通过“自己调用自己”将问题规模不断缩减以解决问题。
为此,递归算法首先最终要的是要有判断结束条件,这是易错点,类似循环中防止无限循环。为解决这个问题通常需要一个控制递归终结的变量,在递归过程中不断改变它的值以达到终结条件,因此该值通常作为函数参数。
回文问题的算法描述如下:
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 }