だから私は、分割統治原則のまわりで私の頭を取得しようとすると、単一の方法で複数の再帰呼び出しています。それは大丈夫だろうが、私は私が書いているメソッドの出力に問題があります。
この方法の目的は、アレイ内の連続番号の全ての対の和を返すことです。私はそこに95%ですが、私が期待する出力を取得していないですし、私はなぜうまくしようとしている年齢のための机に対して頭叩いてきました。
配列は以下のとおりです。
int[] array = { 11, 6, 87, 32, 15, 5, 9, 21 };
この方法は次のとおりです。
public int consecutivePairsSum_DivideAndConquer(int start, int end, int[] array) {
int leftSum;
int rightSum;
int middle = (start + end) / 2;
if (start == middle) {
return array[middle];
} else {
leftSum = array[start] + array[start + 1];
leftSum += consecutivePairsSum_DivideAndConquer(start, middle, array);
}
if (middle == end) {
return array[end];
} else {
rightSum = array[middle] + array[middle+1];
rightSum += consecutivePairsSum_DivideAndConquer(middle+1, end, array);
}
return leftSum + rightSum;
}
ここに私のメソッド呼び出しです:
System.out.println(rF.consecutivePairsSum_DivideAndConquer(0, array.length-1, array));
私は私が配列が、私の右出力を与えている実験の無い量を分割しているどのように何かでなければならないと思います。
予想される出力:340
実際の出力:330
任意の提案大歓迎、これはナット私を運転しています!:P
PS(SOの範囲内というのは、それが直接のヘルプはプログラミングの問題ではありませんどのように見ている場合)私も素晴らしいだろう再帰についての固体オンラインチュートリアル/良い本を見つけることができる場所に任意の便利なリンク
ここでは、アルゴリズムの概要です:
基本ケース:あなたの配列は、以下の2つの要素を持っている場合、結果は0
(何のペアが存在しないため)。
そうでなければ:、半分にアレイを分割し、左半分と右半分の結果を計算し、次いで、アレイ全体についての結果は以下のようになり<result of left half> + <result of right half> + <last element of left half> + <first element of right half>
(ここで欠落のみペアが分割の位置に一対であるため)。
Javaでは、それはこのようなものになるだろう。
int consPairSum(int[] array, int left, int right) {
if(right <= left + 1) return 0;
int mid = (left + right) / 2;
int leftPairSum = consPairSum(array, left, mid);
int rightPairSum = consPairSum(array, mid, right);
return leftPairSum + rightPairSum + array[mid - 1] + array[mid];
}
それは次のように呼ばれるべき
consPairSum(array, 0, array.length);