Ruby の複数の値を返す機能を利用して、これを行う方法を次に示します。最初の値は分割のインデックス (存在する場合)、2 番目の値は各半分の合計 (分割が見つからない場合は配列全体の合計) です。
def split(arr, index = 0, sum = 0)
return -1, arr[index] if index == arr.length - 1
sum = sum + arr[index]
i, tail = split(arr, index + 1, sum)
if i > -1
return i, tail
elsif sum == tail
return index, sum
end
return -1, arr[index] + tail
end
次のように呼び出します。
p split([1, 1, 2])
p split([1])
p split([-1, 2, 1])
p split([2, 3, 4])
p split([0, 5, 4, -9])
結果は次のようになります。
[1, 2]
[-1, 1]
[1, 1]
[-1, 9]
[0, 0]
編集:
これは、onebyone.livejournal.com のコメントに対処するために少し修正されたバージョンです。これで、配列内の各インデックスは 1 回だけアクセスされます。
def split(arr, index = 0, sum = 0)
curr = arr[index]
return -1, curr if index == arr.length - 1
sum = sum + curr
i, tail = split(arr, index + 1, sum)
if i > -1
return i, tail
elsif sum == tail
return index, sum
end
return -1, curr + tail
end