سؤال

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;
 }

لن تقبل منصة Java الخاصة بي (Eclipse) هذا الرمز على أنه يعمل ، بسبب "نقص نوع الإرجاع". الآن أعرف في Expilet Coding Exply ، من الأفضل استخدام قيمة إرجاع واحدة فقط ، ولكن عندما يتعلق الأمر بالكروية ، يكون هذا جديدًا إلى حد ما بالنسبة لي. كيف يمكنني القيام بذلك؟ إذا قمت بتثبيت نوع منطقي في الجزء العلوي من هذه الطريقة ، فإنه يقوم بإنشاء مثيل جديد لهذا المتغير (وتشكيله على أنه خالي أو أي شيء قمت بتعيينه إليه) في كل مرة يتم فيها تشغيل الطريقة ، ولكن إذا وضعته فوق مُنشئتي ، لن يتم تعيين قيمة لها/لا يمكن إرجاعها.

في الأساس ، كيف يمكنني تعديل الكود الخاص بي للحصول على قيمة إرجاع واحدة تقبلها Eclipse كما هو الحال دائمًا؟ يمكنني القيام بذلك بسهولة بما فيه الكفاية مع الحلقات ، لكنني لست متأكدًا من كيفية التعامل مع الموضوع مع العودية.

هل كانت مفيدة؟

المحلول

يمكنك بالتأكيد القيام بذلك:

return palindrome(input, i, j);

ومع ذلك ، من الممارسات الجيدة الحصول على عودة واحدة لتحسين قابلية القراءة. جرب هذا على الحجم:

   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;
 }

هل لديك هذا المنطق دائمًا. المفتاح هنا هو جعل عودة Palindrome يتم تخزينها في هذا المنطق.

الجزء العودية يأتي في مكالمة إلى palindrome. لن يعيد إلا في النهاية القيمة النهائية بعد جميع المكالمات العودية ، لأنها تحدد فقط ما إذا كانت عبارة عن palindrome عندما تصل إلى نهاية الدورة العودية.

نصائح أخرى

فقط لتحسين قابلية القراءة:

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);
}

إذا تمكنا من استخدام C# و LINQ (بما أنني لا أملك بيئة Java Dev هنا) لعكس صفيف Char:

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

المشكلة هي أنه ليس لديك عودة داخل البيان الثاني. إذا كان charat i و j متساويين ، فلن تعيد أي شيء أبدًا.

الحفاظ على روح الكود الخاص بك ، كنت أقصر الأمر برمته:

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;
}

في الثانية إذا كتلة ، لا تعيد أي شيء.

فقط قم بتغيير المكالمة العودية بحيث تقوم بإرجاع قيمتها:

  return palindrome(input, i, j);

أيضًا ، بالمناسبة ، لا تحتاج إلى القيام بـ i ++ و j-في الحظر-يمكنك بدلاً من ذلك استدعاء طريقة palindrome باستخدام i+1 و J-1 بدلاً من ذلك ، وسيكون لها نفس التأثير بشكل أساسي.

        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";
          }
           }
         //--------------------------------------------//

قد يكون هذا الخيار الآخر:

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;
    }

ربما يمكن أن تساعد هذه الإجابة (في بيثون):

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])

هذا لن يعيد أي شيء على الرغم من أنه يمكننا إعادة سلسلة في البداية 'if' بند لأن البرنامج سوف يتوقف في نهاية المطاف في تلك المرحلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top