簡體   English   中英

使用遞歸和字符數組搜索檢查回文

[英]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;
}

}

這里有幾個主要問題,但您有正確的想法:

  1. 您的遞歸函數使用左右索引來確定要在測試字符串中比較哪些字符。 但是,這兩個指針在調用函數時會立即設置到字符串的左右兩端,因此它們永遠不會向中間遞歸移動。 由於索引相等的基本情況無法訪問,因此堆棧溢出。 請記住,這些調用在堆棧中一直是相同的,但具有不同的參數,因此像設置初始索引這樣的一次性“設置”任務應該移到遞歸函數之外。

  2. 您的初始指針索引是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM