0

たとえば、2 サイクルを印刷する 5 の期間を使用すると、次のようになりますfor%

for(auto i = 0; i < 5 * 2; ++i) cout << i % 5 << endl;

結果:

0
1
2
3
4
0
1
2
3
4

関数が三角波を返すようにしたいので、いくつかの関数についてfoo

for(auto i = 0; i < 5 * 2; ++i) cout << foo(i, 5) << endl;

次のようになります。

0
1
2
1
0
0
1
2
1
0

そのような機能はありますか、それとも自分で考え出す必要がありますか?

4

3 に答える 3

2

非常によく似た質問がここで回答されたようです:三角波を生成する1行関数はありますか?

ノルドリンの回答から引用:

三角波

y = abs((x++ % 6) - 3);

これにより、3 と 0 の間で振動する周期 6 の三角波が得られます。

それを関数に入れます:

int foo(int inputPosition, int period, int amplitude)
{
    return abs((inputPosition % period) - amplitude);
}
于 2015-02-18T16:29:47.953 に答える
0

自分で作成する必要があります:

// Assumes 0 <= i < n
int foo(int i, int n) {
    int ix = i % n;
    if ( ix < n/2 )
        return ix;
    else
        return n-1-ix;
}
于 2015-02-18T16:23:21.087 に答える
0

この質問が重複しているため、この質問を閉じる前に、少なくとも正しい回答をここに投稿する必要があると思いました。

Eric Bainvile の答えは正しいものです。

int foo(const int position, const int period){return period - abs(position % (2 * period) - period);}

periodただし、これにより、[0, ] からの範囲と の周波数の三角波が得られ、[0, ]2 * periodからの範囲period / 2と の周期が必要periodです。fooこれは、期間の半分を関数に渡すか、関数を調整することで実現できます。

int foo(const int position, const int period){return period / 2 - abs(position % period - period / 2);}

このような単純な関数では、インライン化が望ましいと思われるため、最終的な結果は次のようになります。

for(auto position = 0; position < 5 * 2; ++position) cout << 5 / 2 - abs(position % 5 - 5 / 2) << endl;

要求されたもの:

0
1
2
1
0
0
1
2
1
0

于 2015-02-19T11:49:29.563 に答える