2014/12/23 16:51:20

周期性を持たせる処理

目次(クリックするとジャンプします)
  • 1:周期性を持たせたい
  • 1.1:if文を使って周期を作る
  • 1.2:剰余の活用
  • 2:レベル5デス
  • 3:まとめ

周期性を持たせたい

プログラミングでは処理に周期性を持たせたい場合がよくあります。繰り返しといった方がいいでしょうか。ともかく周期的な処理というのが必要になる事が結構あるはずです。

今回は周期性を持たせる処理について書きたいと思います。

if文を使って周期を作る

j=0;
for(i=0;i<100;i++){
 if(j<=4){
   j=0;
 }
 //何らかの繰り返し処理
 j++;
}

if文を使って周期性を作った例だ(言語は特定していない)。ループのカウンタ[i]とは別に周期用カウンタ[j]を用意しています。ループが回るたびに[j]はインクリメントされます。

ループの中にif文で[j]の大きさを検査して、この場合では4になったら、0にする処理をしています。つまり[j]の中身は0,1,2,3という周期性を持つことになります。

しかしif文を使った周期性の表現は入れ子構造が複雑になるきらいがあります。もし複数の周期性をループ内で表現する場合には多段ネストする可能性があり、あまり好ましくないです。

剰余の活用

この方法よりももう少し簡潔に周期性を表現する方法が剰余の活用です。

剰余は割り算の「あまり」のことです。剰余には周期性が現れます。

剰余を活用すると以下のような形になる(言語は特定していない)

for(i=0;i<100;i++){
 j = i % 4;

 //何らかの繰り返し処理

}

ループカウンタにしている[i]に対して、規則的に表れてほしい周期で割った時の剰余を求めます。 つまり4周期なら4で、16周期なら16で、180周期なら180で割った時の剰余を求める事になります。

以下は4周期を表現した場合の剰余の結果です。(「あまり」を表す時に=を使うべきではないが便宜上)

  • 0 ÷ 4 = 0 あまり 0
  • 1 ÷ 4 = 0 あまり 1
  • 2 ÷ 4 = 0 あまり 2
  • 3 ÷ 4 = 0 あまり 3
  • 4 ÷ 4 = 1 あまり 0
  • 5 ÷ 4 = 1 あまり 1
  • 6 ÷ 4 = 1 あまり 2
  • 7 ÷ 4 = 1 あまり 3
  • 8 ÷ 4 = 2 あまり 0
  • 9 ÷ 4 = 2 あまり 1
  • 10 ÷ 4 = 2 あまり 2
  • 11 ÷ 4 = 2 あまり 3
  • 12 ÷ 4 = 3 あまり 0
  • 13 ÷ 4 = 3 あまり 1
  • 14 ÷ 4 = 3 あまり 2
  • 15 ÷ 4 = 3 あまり 3
  • 16 ÷ 4 = 4 あまり 0
  • 17 ÷ 4 = 4 あまり 1
  • 18 ÷ 4 = 4 あまり 2
  • 19 ÷ 4 = 4 あまり 3
  • 20 ÷ 4 = 5 あまり 0

見事に剰余に0,1,2,34周期が表れています。

この剰余を変数に代入するなどして使えば、ループの中で周期性を表現することが可能になるという訳です。

もちろん複数の周期を表現することも可能です。if文を使った時のように入れ子が複雑になることも無いです。4周期の剰余と、16周期の剰余を同時に活用するなどもできます。

  • 周期性のある繰り返し処理
  • ある場合だけ適用したい処理

などに有用です。

レベル5デス

この仕組みはFFのレベル5デスなどと同じだともいえます。

レベル5デスは5で割り切れた場合のみに適用されるようになっています。

レベルに対して5周期で剰余を求め、剰余が無い(割り切れた)場合に、無条件に魔法が適用され、戦闘不能になります。レベル3コンフュ、レベル4フレアなども同じことです。

まとめ

他にもさまざまに周期性を表現する方法はあります。たとえば三角関数を使うなどです。

繰り返し現れることを活用できれば、どのような方法でもかまわないでしょう。もちろん処理が非効率になってはいけないので精査は必要だと思います。