それは間違いなく正しくありません。
再帰呼び出しの戻り値を無視するため、プログラムは実際A[m] == m
には最初の呼び出しでのみチェックし、そう-1
でない場合に戻ります。
「明白な」解決策は次のようになります。
public static int IndexSearch(int []A, int l, int r) {
for i in range(1, length(A))
if (A[i] == i)
return i
return -1
}
また、これは非常に明確なソリューションであるため、より洗練されたソリューションよりも優先される可能性があります。
申し訳ありませんが、他の質問についてはお答えできません。
編集:これはうまくいくはずです。Python で書かれていますが、理解しやすいはずです。分割統治のポイントは、解決策が明らかなところまで問題を縮小することです。私たちの場合、それは要素が 1 つだけのリストになります。ここで唯一難しいのは、戻り値を返すことです。
def index(l, a, b):
if a == b: #The basecase, we consider a list with only one element
if l[a] == a:
return a
else: return -1
#Here we actually break up
m = (a+b)/2
i1 = index(l, a, m)
if i1 != -1:
return i1
i2 = index(l, m+1, b)
if i2 != -1:
return i2
return -1
出力例を次に示します。
l = [1,2,3,3,5,6,7,8,9]
print index(l, 0, len(l)-1)
Output: 3
それが役立つことを願っています。
編集:すべての出現箇所を見つけると、実際にははるかに優れたソリューションにつながります:
def index(l, a, b):
if a == b:
if l[a] == a:
return [a]
else:
return []
m = (a+b)/2
return index(l, a, m) + index(l, m+1, b)
出力は次のとおりです。
l = [1,2,3,3,5,6,7,8,8]
print "Found " , index(l, 0, len(l)-1), " in " , l
Found [3, 8] in [1, 2, 3, 3, 5, 6, 7, 8, 8]
と
l = range(0,5)
print "Found " , index(l, 0, len(l)-1), " in " , l
Found [0, 1, 2, 3, 4] in [0, 1, 2, 3, 4]
私はそれが素晴らしい、純粋な解決策になると思います;-)