2015-04-26 3 views
0

Напишите рекурсивный метод, называемый isReverse («word1», «word2»), который принимает две строки как параметры и возвращает true, если две строки содержат такую ​​же последовательность символов, как в противоположный порядок, игнорируя случай и возвращая false в противном случае. Например, вызов:Что не так с моим методом isReverse

isReverse("Desserts", "Stressed") 

будет возвращена истина. [Так есть ли десерты при стрессе?] Нулевые, пустые и однобуквенные строки также должны возвращать true (если оба параметра имеют одинаковое значение). Это домашнее задание, и у меня возникли проблемы с тем, чтобы этот код работал надлежащим образом. Он возвращает true независимо от того, что я делаю.

public static boolean isReverse(String word1, String word2) 
{ 
    if(word1 == null || word2 == null) 
    { 
     if(word1!= null && word2 != null) 
     { 
      return false; 
     } 
     return false; 
    } 
    else if(word1.length() == word2.length()) 
    { 
     String firstWord = word1.substring(0, word1.length()); 
     String secondWord = word2.substring(word2.length()-1); 
     if (firstWord.equalsIgnoreCase(secondWord)) 
     { 
      return isReverse(word1.substring(0, word1.length()), word2.substring(word2.length() - 1)); 
     } 
    } 
    return true; 
} 
+0

Строка или класс StringBuffer имеет обратный метод –

+0

@SrinathGanesh - StringBuilder имеет обратное, но мы должны предположить, что он не учил о классе Builder. Я прошел через 3 года колледжа без упоминания. – Hobbyist

+1

Учитывая, что это домашнее задание, я бы предположил, что использование встроенной функции для завершения 95% задания является запрещенным. – aroth

ответ

0

Является ли это упражнение? Рекурсия не кажется лучшим вариантом здесь. В любом случае, вы просто обрезаете одно слово, почему? Вы должны обрезать оба слова, если вы ожидаете сравнить каждый символ в каждом рекурсивном вызове. И вы даже не проходите обрезанные слова как параметр к рекурсивной функции!

Основная вещь, которую вам не хватает, это базовый корпус. Когда рекурсия должна вернуться? В вашем случае вы уменьшаете размер каждой строки на каждом этапе рекурсии, поэтому у вас должен быть базовый футляр, чтобы проверить, равен ли он размеру.

Надеется, что этот код очистить свой ум:

public static boolean isReverse(String word1, String word2) { 
    if (word1 == null || word2 == null) { 
     return false; 
    } 
    if (word1.length() == 1 && word2.length() == 1) { 
     //Used equals just for fast compare 
     return word1.equals(word2); 
    } else if (word1.length() == word2.length()) { 
     if (word1.charAt(0) == word2.charAt(word2.length() - 1)) { 
      String firstWord = word1.substring(1, word1.length()); 
      String secondWord = word2.substring(0, word2.length() - 1); 
      System.out.printf("Trimmed %s, %s to %s, %s\n", word1, word2, firstWord, secondWord); 
      return isReverse(firstWord, secondWord); 
     } else { 
      //Characters didn't matched 
      return false; 
     } 
    } else { 
     //Lenght doesn't match 
     return false; 
    } 
} 
1

Во-первых, у вас есть этот набор, чтобы он возвращал только false, если оба слова равны нулю; Если они не являются нулевыми, вы повторно вызываете метод (в случае, если длина равна), которая вернет true.

private static boolean isReverse(String a, String b) { 
    // make sure the strings are not null 
    if(a == null || b == null) return false; 

    // If the lengths are not equal, the strings cannot be reversed. 
    if(a.length() != b.length()) { 
     return false; 
    } 

    // Convert string b to an array; 
    char[] bArray = b.toCharArray(); 

    // Create an array to write bArray into in reverse. 
    char[] copy = new char[bArray.length]; 

    // Iterate through bArray in reverse and write to copy[] 
    for(int i = bArray.length; i < 0; i--) { 
     copy[bArray.length - i] = bArray[i]; 
    } 

    // Convert copy[] back into a string. 
    String check = String.valueOf(copy); 

    // See if they reversed string is equal to the original string. 
    if(check.equalsIgnoreCase(a)) { 
     return true; 
    } else { 
     return false; 
    } 
} 
1

Вы говорите

if (firstWord.equalsIgnoreCase(secondWord)) 
    { 
     return isReverse(word1.substring(0, word1.length()), word2.substring(word2.length() - 1)); 
    } 

, который OK. Но что, если firstWord не равно второму слову

Он проваливается и возвращает true.

Вы должны добавить

else 
    return false; 

Я также добавлю, что ваша проверка нулевой не будет работать.

if(word1!= null && word2 != null) 
    { 
     return false; 
    } 

Не полезно, потому что вы уже находитесь в том случае, если это происходит только тогда, когда word1 или word2 равно null. Поэтому они не могут быть null и null здесь.

Это будет работать, если вы сделали это

if(word1 == null && word2 == null) 
    { 
     return true; 
    } 
0

Сначала я отменил один из строки (я взял word1) с использованием recursion.then по сравнению с второй строкой, если оба строк равны результат установлены верно.

public static boolean isReverse(String word1, String word2) 
{ 
    boolean result = false; 
    //check null to avoid null pointer exception 
    if(word1 == null | word2 == null){ 
     result = false; 
    }else if(word1.length() == word2.length()){ 

     word1 = reverseString(word1); 
     if(word1.equalsIgnoreCase(word2)){ 
      result = true; 
     } 
    } 
    return result; 

} 

static String reverse = ""; 
public static String reverseString(String str){ 

    if(str.length() == 1){ 
     reverse+=str; 

    } else { 
     reverse += str.charAt(str.length()-1) 
       +reverseString(str.substring(0,str.length()-1)); 
    } 
    return reverse; 
} 
+0

Можете вы объяснить, что вы здесь сделали? Ответы только на код, как правило, не очень объяснительны. – halfer

Смежные вопросы