プロが教える店舗&オフィスのセキュリティ対策術

変数xを
1→2→3→1・・・

とループさせるには、(x mod 3)+1とすればよいですが、逆順にループさせるにはどうすればよいですか?
マイナス方向がうまく作れず苦戦しております

言語はVisualBasic です

A 回答 (8件)

では、別解



const MAX_X as integer=3 'constで最大値を定義する。
x=1
While True
x = if(x<=1,MAX_X,x-1)
End While


ちなみに、コンピュータでの割り算って、四則演算では一番計算に時間がかかる演算です。
見た目には1つの式で書くのがいいように見えますが、実際には加減算とif文の方が効率がいいこともあります。
    • good
    • 0

nの一般式って、こんなので良いのでしょうか。

でもこれって、No.3さんの回答のまんまですよ。

x = ((x + n - 2) Mod n) + 1
    • good
    • 0
この回答へのお礼

Thank you

できました!

お礼日時:2019/02/12 23:37

それを 4から引けばいいんじゃないの

    • good
    • 0
この回答へのお礼

x = 1

while true
x = 4 - ( ( x mod 3 ) + 1 )
wend

としたとしても得られる結果は、 3,1,3,1,・・・・・

お礼日時:2019/02/12 23:37

こんにちは



No4様が、せっかく考え方を示してくれているのですから

>x0は別変数ということですかね?
>今のところ別変数やifなどの利用は考えておりません
少しはご自分で考えましょう。
 4 - ((x mod 3) + 1)
でよいのだから、結局
 3 - (x mod 3)
にたどり着くはずなのですけれど・・・

…で、この式をよく見てみると、実は、No1様が一番最初に示してくれている式です。
これに対して、
>だと、2→1→2→1→・・・
として切り捨ててしまっていますね。
(この回答が、仮に望み通りでなくても、十分なヒントになるはずなのだけれど)
質問者様のコメントから推測すると、xの初期値を1としてるっぽいけれど、それでも「2→1→2→1→・・・」になることはありません。
「2,1,3,2,1・・・」と初期値を変えた分だけスタートがずれるだけです。
(初期値を0にすれば、ちゃんと、「3,2,1,3,2,1,3,2,1・・・」になります)

「初期値を変えた分」というのは、ご質問文に、
>1→2→3→1・・・
>とループさせるには、(x mod 3)+1とすればよい
とあるけれど、これはxの初期値を0としなければ、1,2,3・・・とはならないので、
(初期値が1の場合は、「2,3,1,2,3,1・・・」となる)
質問文を読んだ回答者は、(直接書いてはありませんが)「xの初期値を0」と想定して回答しているのです。

それを勝手に1からに変えるのはご自由ですけれど、変えた分の調整が必要になります。
(回答者には、「初期値を変えた」という情報はないので、当然配慮はしません)
初期値を変えても、簡単な調節で対応できることに気付きませんでしょうか?
ご質問の場合を例にすれば、初期値が1なら
  3 - (x - 1 mod 3)
もちろん、初期値が0なら
  3 - (x mod 3)
のまま。
同様に、もし初期値が2でも、3や-1とかであっても、整数であれば簡単に調整が可能です。
(実数であったとしても、整数化すれば対応できます)
別の発想として、変数をインクリメントする代わりにデクリメントで対応するという考えもあるでしょう。

例えば、求めたい数列が、「3,3,2,2,1,1,3,3,2,2,1,1・・・」のような場合であったとしても、考え方の応用ができさえすれば対応は可能なはずですけれど。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
こちらの書き方が悪かったのですが、

while true
x = x の式
wend

として実行をしたときに、ある数値nから1までの数値を循環するようにしたかったのです。(実際には無限ループにはしませんが)



提示していただいた例は、for文における「y = xの式」を想定しての回答だと思われますが、「 x = xの式」では残念ながら循環の結果は得られませんでした。
>もちろん、初期値が0なら
  3 - (x mod 3)

x = 0
while true
x = 3 - ( x mod 3 ) ' → 3 , 3 , 3 , 3 , ・・・・・
wend

>3 - (x - 1 mod 3)
3 - ( ( x - 1 ) mod 3 ) だと思われますが、

x= 1
while true
x = 3 - ( (x-1) mod 3 ) ' → 2 , 1 , 2 ,1 ・・・・
wend

お礼日時:2019/02/12 23:32

x0 = (x0 mod 3) + 1


でループして
x=4-x0
で x を求める。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

x0は別変数ということですかね?
今のところ別変数やifなどの利用は考えておりません

お礼日時:2019/02/12 08:12

x = 1


x = ((x + 1) mod 3) + 1
かな?

0からでないからちょっと演算面倒ですな。
    • good
    • 1
この回答へのお礼

ありがとうございます、確かにできました。

今回のように分母が3のケースでは対応できますが、それより大きいケースだとうまくできないですね。
最終的には3だけではなくて、nの一般式にしたいです

素直に0を含めたループにすべきなのでしょうか

お礼日時:2019/02/12 08:18

なるほど。

そういうことですか。
では、これでどうでしょう(ちょっと邪道ですが)。

x = 1
x = Choose(x, 3, 1, 2)
    • good
    • 0

3 - (x Mod 3)

    • good
    • 0
この回答へのお礼

x = 1
x = 3 - (x mod 3)

だと、2→1→2→1→・・・
になってしまいます

お礼日時:2019/02/11 21:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!