0

私の仕事は

進行 {x i }の n 個の要素を画面に表示します。

X i = X i-1 - 3X i-2
X 0 = 0
X 1 = 2
i = [2,n]

これで完了ですが、このテーマがよくわからなかったので、助けが必要です。私のコード(動作しません):

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int n = Edit1->Text.ToInt();
  int i, x;
  if(n==0){
    i=0;
    Label1->Caption = IntToStr(i);
  }
  if(n==1){
    i=2;
    Label1->Caption = IntToStr(i);
  }
  else {
    for(i=2;i<=n;i++){
      x=(i-1)-3*(i-2);
      Label1->Caption = IntToStr(x);
    }
  }
}

C++ Builder でコードを記述する必要はあまりありません。

4

2 に答える 2

1

進行式を誤解しています。進行中に計算された以前の要素Xi-1を参照してください。Xi-2

したがって、計算したばかりの以前の値を保持する 2 つの変数が必要です。任意のループでXi、一般的な累進式を使用して現在の値を計算し、 の値を にコピーして、 の前の値Xi-1Xi-2スローしますXi-2Xi次に、 の値(現在までの現在の値) を にコピーしますXi-1

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int n = Edit1->Text.ToInt();
  int i, x;
  int xim1, xim2
  if(n==0){
    i=0;
    Label1->Caption = IntToStr(i);
  }
  if(n==1){
    i=2;
    Label1->Caption = IntToStr(i);
  }
  else {
    xim1 = 2;
    xim2 = 0;
    for(i=2;i<=n;i++){
      x = xim1-3*xim2;
      xim2 = xim1;
      xim1 = x;
    }
    Label1->Caption = IntToStr(x);
  }
}
于 2015-04-03T14:38:42.390 に答える
0

この生成関数が与えられた場合:

    X_0 = 0
    X_1 = 2
    X_i = X_{i-1} + 3*X_{i-2}             i = [2,n]

x_4 をどのように計算しますか? X_4 = X_3 + 3*X_2 であることはわかっています。つまり、X_3 と X_2 を計算できる必要があります。これらは次のように記述できます。

    X_2 = X_1 + 3*X_0 = 2 + 3*0 = 2
    X_3 = X_2 + 3*X_1 = 2 + 3*2 = 8
    X_4 = X_3 + 3*X_2 = 8 + 3*2 = 14

これは通常、再帰関数として記述できます。

    int calcSeries(int n)
    {
        if(0 == n)
            return 0;
        if(1 == n)
            return 2;

         return calcSeries(n-1) + 3*calcSeries(n-2)
    }

ところで、これはこのシリーズの非常に単純な実装です。主な問題は、2 つの再帰ツリーがあることです。上記の X_4 の手展開を見ると、X_2 が (X_3 と X_4 の計算で) 2 回表示されることに注意してください。ただし、この値は保存されないため、2 回計算する必要があります。

于 2015-04-03T14:34:08.067 に答える