Я студент, и я работал над следующей задачей: найти подстроку (иглу) в большей строке (стог сена) без использования метода substring
и используя рекурсию. Рекурсия не мой конек, но я выработал следующее:Рекурсия ведет себя непредсказуемым образом с Java
public class Contains
{
public static void main(String[] args)
{
System.out.println(contains("Java programming", "ogr", false));
}
public static boolean contains(String haystack, String needle, boolean doesContain)
{
if(haystack.length() < needle.length())
{
return false;
}
else
{
for(int i = 0; i < needle.length(); i++)
{
if(haystack.charAt(i) != needle.charAt(i))
if((i + 1) == needle.length())
{
doesContain = false;
break;
}
else
break;
else
if((i + 1) == needle.length())
{
doesContain = true;
break;
}
else
continue;
}
char[] haystackChar = haystack.toCharArray();
char[] newCharArray = new char[(haystackChar.length - 1)];
for(int j = 1; j < haystackChar.length; j++)
{
newCharArray[j - 1] = haystackChar[j];
}
String newStr = new String(newCharArray);
if(doesContain == false)
contains(newStr, needle, doesContain);
}
return doesContain;
}
}
Я понимаю, что это не может быть лучшим или наиболее элегантным решением, но я в основном просто пытаюсь заставить его работать. Я запускаю его в отладчике Eclipse, и все работает так, как ожидалось, до вызова if(doesContain == false)
во время вызова метода на contain
, где doesContain
имеет значение true во время итерации цикла for. Отладчик показывает значение doesContain
, чтобы (правильно) быть истинным, и показывает, что он пропускает оператор if и выходит из блока else. Однако сразу после этого он перескакивает обратно в блок else и только вызывает рекурсивный вызов contain
вместо того, чтобы возвращать doesContain
. Затем он продолжает работать рекурсивно, а затем терпит неудачу и возвращает false, потому что теперь он просматривает остальную часть строки, где «игла» не находится.
Я знаю, что StackOverflow не является «домашней помощью», но я программирую для других целей, кроме школы, и я совершенно недоумеваю, почему он ведет себя таким образом. Кто-нибудь знает, почему он это делает? Я что-то упустил?
О, мужик, мне жаль, что я не был девушкой, чтобы получить ответы на спам! В любом случае ваш (правда, плохо отформатированный) код работает нормально. Проблема в том, что вы отбрасываете результаты рекурсивных вызовов. Изменить 'содержит (newStr, needle, doesContain);' to 'return содержит (newStr, needle, doesContain);' и vòila! –