私は学生ですが、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デバッガでそれを実行していましたが、contain
へのメソッド呼び出し中にを呼び出すまではすべて期待通りに機能していましたが、forループの繰り返し中にdoesContain
がtrueに設定されています。デバッガはdoesContain
の値が(正しく)真であることを示しており、if文をスキップしてelseブロックを終了することを示しています。しかし、その直後に、それはelseブロックにジャンプし、doesContain
の代わりにcontain
への再帰呼び出しを呼び出します。次に、 "針"が配置されていない文字列の残りの部分を検索しているため、再帰的に動作し続け、失敗してfalseを返します。
私はStackOverflow自体が「宿題の手助け」の場所ではないことを知っていますが、私は学校以外の目的でプログラムしています。なぜこのように振舞っているのか非常に困惑しています。誰がなぜこれをやっているのか知っていますか?私はここに何かを逃していますか
オハイオ州の男、私は答えでスパムになる女の子だったらいいのに!とにかくあなたの(間違いなく形式が不適切な)コードは正常に動作しています。問題は、あなたが再帰呼び出しの結果を破棄していることです。 'newStr、needle、doesContain);'を( 'newStr、needle、doesContain);'と 'vòila! –