• ベストアンサー

rubyのループについて

5600を偶数なら2で割り、奇数なら+1を加え偶数にして、それをまた2で割る~・・・ 繰り返すループをwhile を使って簡潔に書きたいのですがよろしくお願いします。 または、どのようなバリエーションがあるのか 教えてください。それと1までいったら止まるようにします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

>while ? do という形を使っても、おなじようなことができますでしょうか? 以下のようにしてください。 ---------------------------- print "input=>" data = gets num = data.to_i while num > 1 do p num if num%2 == 0 num = num / 2 else num = (num + 1) / 2 end end p num ---------------------------- 実行結果 ------------------------- input=>5600 5600 2800 1400 700 350 175 88 44 22 11 6 3 2 1 ---------------------------------

Raiki77
質問者

お礼

ありがとうござまいす。凄いと思います。感謝します。 大変参考になりました。

その他の回答 (2)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

以下のようにしてください。 ------------------------------- print "input=>" data = gets num = data.to_i while true p num break if num <= 1 if num%2 == 0 num = num / 2 else num = (num + 1) / 2 end end -------------------------------- 実行結果は以下のとおり。 input=>100 100 50 25 13 7 4 2 1 ---------------------------------- 尚、whileを使わずに再帰処理で行なう場合は以下のようにします。 ---------------------------------------- def shori(num) p num return if num <= 1 if num%2 == 0 num = num / 2 else num = (num + 1) / 2 end shori(num) end print "input=>" data = gets shori(data.to_i) -----------------------------------------

Raiki77
質問者

お礼

ありがとうござまいす。とても参考になります。いろいろなやり方があるんですね。

Raiki77
質問者

補足

ありがとうございます。驚きです。参考書よりも参考になります。 while ? do という形を使っても、おなじようなことができますでしょうか? もし差し支えなければ教えてください。よろしくお願いします。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

偶数を2で割る 処理 奇数なら+1する 処理 (偶数になっているので)2で割る ... というループなのでしょうか? 偶数だったら2で割る/奇数なら+1して2で割る 処理 というループなのでしょうか? また、処理の最初は5600なのでしょうか?2で割った2800なのでしょうか? 1で止まるとは、1の処理をして終わるという意味なのか、1の処理はしないで終わるという意味なのか、どちらでしょう? これらがはっきりしないと、プログラムは作れません。 はっきりしたら、処理と計算とループ判定を、仕様を満すように並べます。 テクニックとしては、 偶数だったら2で割る/奇数なら+1して2で割る 処理 の場合、整数/整数=整数(端数切り捨て)となることを利用して num = (num+1)/2 と1つの式に書ける、というものくらいです。

Raiki77
質問者

お礼

ありがとうござまいす。とても参考になります。

Raiki77
質問者

補足

言葉足らずで申しわけありませんでした。とても感謝しています。 偶数だったら2で割り、奇数なら+1して2で割る処理で最終的には、2÷2 で 1になった所で終わるという処理です。その経過を順番に guts 又は print で 5800~ 1 になるまで表示したいのですけど、難しくて分かりませんでした。

関連するQ&A

専門家に質問してみよう