2017-11-12 21 views
2

編集:sumとiの初期値は0にする必要があります。再帰関数変数の初期化

再帰を使用する必要があるタスクを受け取りました。現在、変数 "sum"と "i"を初期化していないため、コードは実行されません。

evalHornerRecメソッドに追加の引数を追加せずにどのようにタスクを達成できるかについてのアイデアはありますか?

// example data: a = {2, 1, -2, 6, 4, 3}, x = 3 

public static double evalHornerRec(double[] a, double x) 
{ 

    int len = a.length; 
    int i; 
    double sum; 


    if (i >= len) 
    { 
     return sum; 
    } 

    else 
    { 
     sum += a[i] * Math.pow(x, i); 
     i++; 
     return evalHornerRec(a, x); 
    } 

} 
+1

あなたはsumと私が関数を呼び出す場所を初期化できませんでしたか?和とiを設定し、それを呼び出すラッパーメソッドを作ることができます。 – Christian

+0

あなたは余分な機能を使用できますか? –

+0

@LuaiGhunim短い答えいいえ、私がすれば世界の終わりではないでしょう。 –

答えて

3

各再帰呼び出しは、より小さい配列で操作する必要があります。再帰呼び出しの引数としてiを追加できない場合は、完全配列の代わりにサブ配列を渡すことができます。

sumについては、このメソッドから返された値であるはずですので、現在の呼び出しで追加された用語に再帰呼び出しの結果を追加する必要があると仮定しています。

public static double evalHornerRec(double[] a, double x) { 
    int len = a.length; 
    if (len <= 0) { 
     return 0.0; 
    } else { 
     double[] subArray = Arrays.copyOf(a,len-1); 
     return evalHornerRec(subArray, x) + a[len-1] * Math.pow(x, len-1); 
    } 
} 

EDIT:私の答えは、あなたの質問にやっているように見えたものに基づいて、しかしthis description of Horner's methodに基づいて、おそらくあなたが求めることになっている再帰が実際にした

なり
evalHornerRec(a,x) = a[0] + x * evalHornerRec (sub array of a[1] to a[n-1]) 

public static double evalHornerRec(double[] a, double x) { 
    if (a.length == 1) { 
     return a[0]; 
    } else { 
     double[] subArray = new double[a.length - 1]; 
     System.arraycopy(a, 1, subArray, 0, subArray.length); 
     return a[0] + x * evalHornerRec(subArray, x); 
    } 
} 

PSの2つの再帰的な方法は同等です。 あなたが示唆した入力(a = {2、1、-2、6、4、3}、x = 3)については、両方とも同じ結果 - 1202.0を与えます。しかし、2番目の方法は再帰的な実装の方が意味があります。最初のものは、単純なforループを使って計算することはできません。したがって、再帰を使用する目的は無効になります。

+0

印象的でエレガントなソリューション! System.arraycopyに関するご質問が1つしかありません(申し訳ありませんが、初心者です)。 subArray.lengthの値を特定する必要があるのはなぜですか?私は[ここ](https://docs.oracle.com/javase/7/docs/api/java/lang/System.html)の説明を読んでいますが、その単純な機能の一部を理解していますが、その情報は冗長ではありません前のコード行でsubArrayの長さを指定したとします。 もう一度多くのお礼を申し上げます。 –

+0

@ doom01 'System.arraycopy'は、ソース配列とターゲット配列の開始インデックスと、コピーしたい要素の数を必要とします。それは必ずしもターゲットアレイを満たすとは限りません。 – Eran