Question

public static boolean palindrome(String input, int i, int j)
 {
  if (i >= j)
   return true;
  if (input.charAt(i) == input.charAt(j))
  {
   i++;
   j--;
   palindrome(input, i, j);
  }
  else if (input.charAt(i) != input.charAt(j))
   return false;
 }

Ma plate-forme Java (Eclipse) ne sera pas accepter ce code que le travail, en raison d'un « manque de type de retour. » Maintenant, je sais que dans ediquite de codage approprié, il est préférable d'utiliser une seule valeur de retour, mais quand il s'agit de récursivité, cela est un peu nouveau pour moi. Comment puis-je prendre? Si j'instancier un type booléen en haut de cette méthode, il est la création d'une nouvelle instance de cette variable (et instanciation comme nul ou tout ce que je le mettre à) chaque fois que la méthode fonctionne, mais si je le place au-dessus de mon constructeur, mon méthode n'attribuer une valeur à elle / ne peut pas le retourner.

En gros, comment dois-je modifier mon code au sujet d'avoir une seule valeur de retour que Eclipse acceptera comme toujours l'exécution? Je peux le faire assez facilement avec des boucles, mais je ne suis pas sûr de savoir comment aborder le sujet avec récursivité.

Était-ce utile?

La solution

Vous pouvez certainement faire ceci:

return palindrome(input, i, j);

Cependant, il est bon d'avoir un retour simple pour améliorer la lisibilité. Essayez ceci sur la taille:

   boolean isPalindrome = false; 
   if (i >= j)
   isPalindrome = true;
   else if (input.charAt(i) == input.charAt(j))
  {
   i++;
   j--;
   isPalindrome = palindrome(input, i, j);
  }
  else if (input.charAt(i) != input.charAt(j))
   isPalindrome = false;
  return isPalindrome;
 }

Avoir toujours que booléen instancié. La clé est de faire le retour de palindrome ici stocké dans ce booléen.

La partie récurrente arrive à l'appel à palindrome. Il ne retournera finalement la valeur finale après que tous les appels récursifs, car elle ne détermine jamais si son un palindrome lorsqu'il atteint la fin du cycle récursif.

Autres conseils

Juste pour une meilleure lisibilité:

public static boolean palindrome(String input, int i, int j)
{
    if (i >= j)
        return true;

    if (input.charAt(i) != input.charAt(j))
        return false;

    return palindrome(input, i + 1, j - 1);
}

Si nous pouvions utiliser C # et LINQ (puisque je n'ai pas Java environnement dev ici) pour renverser un tableau de caractères:

public static bool palindrome(String input)
{
    return input.Equals(new String(input.ToCharArray().Reverse().ToArray()));
}

Le problème est que vous avez pas de retour dans la seconde instruction if. Si charAt i et j sont égaux vous ne revenez rien.

En gardant l'esprit de votre code je réduis la chose jusqu'à être:

public static boolean palindrome(String input, int i, int j)
{
  if (i >= j)
  {
    return true;
  }

  if (input.charAt(i) == input.charAt(j))
  {
    return palindrome(input, i + 1, j - 1);
  }

  return false;
}

Dans le second cas bloc, vous ne retournez pas quoi que ce soit.

Il suffit de changer l'appel récursif de sorte que vous revenez sa valeur:

  return palindrome(input, i, j);

De plus, d'ailleurs, vous n'avez pas besoin de faire i ++ et j-- dans le cas block-- vous pouvez plutôt appeler la méthode palindrome avec i + 1 et j-1 à la place, et qui aura essentiellement le même effet .

        public static String palindrome(String input, int i, int j)
         {

            if (i >= j)
                return "-1";    

         //--------------------------------------------//   

          if (input.charAt(i) == input.charAt(j))
          {
              i++;
              j--;

         //--------------------------------------------//         

              palindrome(input, i, j);
              return "is palindrom";      
          }

         //--------------------------------------------//     

          else 
              return "not palindrom";
          }
           }
         //--------------------------------------------//

Une autre option pourrait être ceci:

boolean isPalindrome(String s) {

        boolean ret = true;

        if (s.length() == 1 || s.equals("")) {
            return ret;
        } else {
            char first = s.charAt(0);
            char last = s.charAt(s.length() - 1);
            if (first != last)
                ret = false;
            else if (s.length() > 2) {
                String partial = s.substring(1, s.length() - 1);
                ret = isPalindrome(partial);
            }
        }
        return ret;
    }

Probablement cette réponse peut aider (en Python):

def isPalinr(str1):
    if len(str1)<=1:
        print('Palindrome')
        return
    if (str1[0] != str1[-1]):
        print ('Not palindrome')
        return
    else:
        return isPalinr(str1[1:len(str1)-1])

Ceci renvoie Aucun si nous pouvons revenir dans la première chaîne clause de 'if' parce que le programme finira par arrêter à ce moment-là.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top