2016-08-17 12 views
-3

私はロボットを動かす必要がある学校のプロジェクトに取り組んでいます。ロボットが1秒ごとにどれだけ移動するか(変数t)は、以下の関数によって計算されます。ロボットがJavaでどのくらい移動するか計算する

Math Function

最初の関数は簡単です。他の2番目と3番目は私が立ち往生している場所です。 F(t-1)はどのように書くのですか?以下は私がこれまで持っていたものです。

if (t == 0) { 
    distance = 2; 
} else if (t > 0 && <=6 || t > 12) { 
    // No clue on how to write the 2nd distance equation. 
} else if (t >= 7 && <=12) { 
    // No clue on how to write the 3rd distance equation. 
} 
+1

どのようにこの機能を使用していますか?あなたがコンテキストを説明したり、あなたがしようとしている関数の定義を与えた方が少し良いかもしれません。 –

+0

あなたはこの問題を解決するために再帰を使用する必要があります!あなたは再帰を使う方法を知っていますか? –

+0

@RenukaDeshmukh no、そうではありません。 –

答えて

2

これは、recursionを使用する問題です。全体として、での特定の機能の評価を意味するので、表記F t-1に注意を払ってください。

私は、コードのすべてを書き出しませんが、私はあなたに基本のいくつかをあげる:

  • をT = 0のときは、リターン2。これがあなたの基本ケースです。
  • tが12より0〜6包括以上である、T-1での機能の評価を返し、tは7と12 両方包括の間にある場合2.
  • を追加し、評価を返しますt-1での関数の値とlog2(t)を加えます。

ここでは、少なくとも正しい方向にあなたを得るためのものがあります。

public double evaluateDistance(int t) { 
    if(t == 0) { 
     return 2; 
    } else if(t > 0 && t <= 6) || (t > 12) { 
     // Think about this - it would involve another call to evaluateDistance, but what is t again? 
    } else if(t >= 7 && t <= 12) { 
     // Another evaluation involving the function. 
     // For free, the change of base operation you'll need to get base-2 evaluation for the log: 
     return ??? + Math.log(t)/Math.log(2); 
    } 
} 
+0

私は割り当てがひどく書かれていると主張します。 ** F(t-1)でなければならないので、関数が** F t **ではなく** F(t)**と定義されている場合、** F t-1 **は間違っています。 )**。とにかく、ただ1つの再帰が存在し、常に 't-1'のために、ループは再帰より良いでしょう。 *(はコメントでは機能しませんが、私の意図を知っているように見えます)* – Andreas

+0

@Andreasという概念には同意できません。ループはより効率的ではるかに簡単ですが、どちらの方法でも傷つけることはありません。 – Makoto

+0

それが私の指摘でした。 *両方*。あなたは割り当てを与えられた最も単純な方法である再帰方法しか示していませんが、私はすでにそれに拍手をかけていますが、ループの "より良い"方法を示していないので、大きな値の 'StackOverflowException' 't'。 – Andreas

5

Recursion本当にこれを解決する必要はありません。

それぞれの非ゼロ時間のケースでは、F(t) = F(t-1) + somethingです。

だから、単に行うことができます。

double f = 2; /* Initial value at t=0 */ 
for (int t = 1; t <= maxT; ++t) { // maxT is the maximum value of t. 
    if (t <= 6 || t > 12) { 
    f += /* something for case 2 */; 
    } else { 
    f += /* something for case 3 */; 
    } 
} 
System.out.println(f); 

あなたは再帰でこれを行うことができますが、控えめに大きくなるStackOverflowErrormaxT場合は取得します。対照的に、ループを使用すると、任意に大きなmaxT(モジュロ浮動小数点エラー)が機能します。


としては、あなたがtのすべての値を超えるループせずにこれを行うことができ、@Andreasが指摘:

double f = 2 * (maxT + 1); 
for (int t = 7; t <= maxT && t <= 12; ++t) { 
    f += log(t) - 2; 
} 

、あなたは値を事前計算することにより、あまりにもそのループを解消することができます。

+0

あなたはループなしでそれを行うことができますよね? – Andreas

+0

@Andreasあなたは再帰やその他の方法を意味しますか? –

+2

t = 1..6の場合:F(t)= t * 2である。 t> 12の場合、F(t)= F(12)+(t-12)* 2である。 t = 7..12の場合、12 + log(7)+ log(8)+ log(9)+ log(10)+ log(11)+を計算するためにループまたは6つの予め計算された定数の配列を行うことができます。 log(12) 'または' t 'に依存するいずれのサブセットであってもよい。 – Andreas

0

私はそれを考え出しました。申し訳ありませんが、私は私が必要なものを明確にされていない場合は、関数内の方程式を書く方法を理解する必要があります。私はそれを考え出したと思う。

public double move() 
{ 
    int t = 0; 
    if(t == 0) // After the first second, robot moves 2 
    { 
     distance = 2; 
    } 
    else if(t > 0 && t <= 6 || t > 12) // From seconds 0 to 6 and after 12, robot moves distance equation 
    { 
     distance = (2*t)+2; 
    } 
    else if(t >= 7 && t <= 12) // From seconds 7 to 12, robot moves distances equation 
    { 
     distance = (2*t)+(Math.log(t)/Math.log(2)); 
    } 
    position = position + distance; 
    return position; 
} 

}

関連する問題