質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

2回答

966閲覧

while文内での無限ループについて

daiishi

総合スコア6

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

1クリップ

投稿2020/09/14 06:33

実現したいこと

「1〜N番目の整数の逆数の総和が5を超えるときのNの値を求めるためのプログラム」
の作成(例 1/1 + 1/2 + 1/3 + 1/4 + 1/5 .... 1/N が5を越える時)において
while文の条件内で分数を使用すると、無限ループにハマってしまうのを解消したい。

該当のソースコード

Aパターン

ruby

1def reciprocal_sum 2 array = [] 3 sum_array = 0 4 n = 1 5 while sum_array < 5 6 r = Rational(1, n) #この部分が違う 7 array << r 8 sum_array = array.sum 9 n += 1 10 end 11 return n - 1 12end

Bパターン

ruby

1def reciprocal_sum 2 array = [] 3 sum_array = 0 4 n = 1 5 while sum_array < 5 6 r = (1.0 / n) #この部分が違う 7 array << r 8 sum_array = array.sum 9 n += 1 10 end 11 return n - 1 12end

質問

rubyで分数を使用するときは1/nのような形ではintegerクラスと判断され小数点以下が切り落とされ0として扱われると学習したので、AパターンでRational(1, n)を使用したのですが無限ループに入ってしまいます。
Bパターンのように書くと無限ループせずに動きます
なぜこのような違いが起きるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2020/09/14 06:54

何をもって無限ループと判断したのでしょうか?
daiishi

2020/09/14 08:14

無限ループした時と同じような挙動に見えて、そう思い込んでいました。 計算に時間がかかっていただけのようです。
guest

回答2

0

私の環境(paiza.io)だとどちらも問題なく動きました。

途中に
printf("%f ",r)

printf("%f\n",sum_array)
をはさみ込んでみて数値を確認してみてはいかがでしょうか

投稿2020/09/14 07:33

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daiishi

2020/09/14 08:04

ありがとうございます。 提案していただいた方法で、無限ループではなかったことが確認できました。
guest

0

ベストアンサー

本当にそれは「無限ループ」していると確認できたのでしょうか?

「1/1 + 1/2 + 1/3 + 1/4 + 1/5」のようにRationalで計算していけば、分母はどんどん大きくなって、加速度的に計算が遅くなっていきます。「単に計算がものすごく遅くて、なかなか終わらないだけ」という可能性も考えられます。

投稿2020/09/14 06:56

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/09/14 07:04

なお、「1/1 + 1/2 + 1/3 + 1/4 + 1/5 …」のような級数を「調和級数」といいますが、これは発散する(充分に多数の項の和を取れば、いくらでも大きい和になりうる)ことが知られています。
daiishi

2020/09/14 08:03

ご指摘ありがとうございます。 無限ループかどうかの確認方法もわかっていなかったので、無限ループだと思い込んでいました。 パターンAとバターンBのコードの速度はなぜここまで差があるのでしょうか?
maisumakun

2020/09/14 08:05

Rationalの場合は、厳密な値を出すために、分母も分子もどんどん大きくなっていきます。 Floatの場合は有効数字の範囲で計算を打ち切るので、どこまで行っても計算速度は一定です。
daiishi

2020/09/14 08:19

なるほど! 大変勉強になりました。 データ型の違いでどのように計算されるかなど、まだまだ理解が乏しいのでもっと勉強します。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問