[英]Check for Palidrome using Recursion and Char Array search
我目前正在嘗試使用一個函數來比較左側和右側字符,以返回一個真或假的布爾值,以確定用戶輸入的字符串是否為回文,但我得到了一個模糊的錯誤聲明第 44 行。不知道如何進行。 我是初級Java程序員,思想開放,願意學習,所以不要烤我哈哈。
import java.util.Scanner;
/**
*
* @author owner
*/
public class Q2_RecursivePalidrome {
public static void main(String[] args) {
int leftSideCharacter = 0;
int rightSideCharacter = 0;
Scanner scan = new Scanner (System.in);
System.out.println("Enter word to check whether palidrome: ");
String userInput = scan.next();
char[] checkPalidrome = userInput.toCharArray(); // creates an array of characters
System.out.println(isPalidrome(checkPalidrome, leftSideCharacter, rightSideCharacter));
}
public static boolean isPalidrome(char[] checkPalidrome, int leftSideCharacter, int rightSideCharacter) {
leftSideCharacter = 0;
rightSideCharacter = checkPalidrome.length - 1; // java arrays start at 0, not 1.
if (rightSideCharacter > leftSideCharacter) { // check both ends of string character by character
// to be palidrome, both sides of string should be same
//
if (checkPalidrome[leftSideCharacter] == checkPalidrome[rightSideCharacter]) {
return (isPalidrome(checkPalidrome, leftSideCharacter + 1, rightSideCharacter - 1));
}
else {
return false;
}
}
return true;
}
}
這里有幾個主要問題,但您有正確的想法:
您的遞歸函數使用左右索引來確定要在測試字符串中比較哪些字符。 但是,這兩個指針在調用函數時會立即設置到字符串的左右兩端,因此它們永遠不會向中間遞歸移動。 由於索引相等的基本情況無法訪問,因此堆棧溢出。 請記住,這些調用在堆棧中一直是相同的,但具有不同的參數,因此像設置初始索引這樣的一次性“設置”任務應該移到遞歸函數之外。
您的初始指針索引是0, 0
。 這是對遞歸函數的不准確“設置”調用——它應該是0, string.length - 1
。
以下是修復這些問題並清理注釋和變量名稱的代碼:
import java.util.*;
public class Q2_RecursivePalidrome {
public static void main(String[] args) {
String test = "racecar";
System.out.println(isPalidrome(test.toCharArray(), 0, test.length() - 1));
}
static boolean isPalidrome(char[] test, int l, int r) {
if (l < r) {
if (test[l] == test[r]) {
return isPalidrome(test, l + 1, r - 1);
}
else {
return false;
}
}
return true;
}
}
順便說一下,從這一切中吸取的重要教訓是如何調試您的程序。 在這種情況下,在遞歸函數的頂部打印索引(從一次調用更改為下一次調用的參數)將清楚地表明它們沒有按照您的預期運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.