• ベストアンサー

ユークリッドの互除法

ユークリッドの互除法をJavascriptで書こうとしてます。以下のように書いたのですが、うまく動きません。(45と60の最大公約数を求めるプログラム) <script> window.alert(gcd(45, 60)); function gcd(a, b){ var r=a%b; if(r==0){ return b; }else{ gcd(b, r); } } </script> undifinedとなってしまいます。どうしたら正確な答えが出るでしょうか?

  • koun
  • お礼率37% (81/216)

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

  • ベストアンサー
  • molt461
  • ベストアンサー率75% (3/4)
回答No.2

既にTacosanもご指摘してますが、 <script> window.alert(gcd(45, 60)); function gcd(a, b){ var r=a%b; if(r==0){ return b; }else{ gcd(b, r);  //ここでreturnしてないので計算結果が破棄される } } </script> 再帰的にgcdを辿っていきますが15という結果をreturnしたあとに破棄されているのでundefinedになります。 なので例えばwindows.alert(gcd(15,15))とか答えが一発で出るような物であれば正常に動くのではないでしょうか。

koun
質問者

お礼

回答ありがとうございます。確かにreturnをつけると正常に動作します。予想ですが、Javascriptでは次のように処理されているのではないかと思います。 「gcd(45, 60)→gcd(60, 45)→gcd(45, 15)→r==0でgcd(45, 15)の戻り値は15。しかし、gcd(45, 60)の戻り値は定義されていない。」 このような理解でいいのでしょうか?

その他の回答 (2)

  • molt461
  • ベストアンサー率75% (3/4)
回答No.3

回答の補足の使い方がわからないので新規回答ですいません…。 >回答ありがとうございます。確かにreturnをつけると正常に動作します。 >予想ですが、Javascriptでは次のように処理されているのではないかと思います。 >「gcd(45, 60)→gcd(60, 45)→gcd(45, 15)→r==0でgcd(45, 15)の戻り値は15。しかし、gcd(45, 60)の戻り値は定義されていない。」 >このような理解でいいのでしょうか? 「gcd(45, 60)→gcd(60, 45)→gcd(45, 15)→r==0でgcd(45, 15)の戻り値は15。しかし、gcd(60, 45)の戻り値は定義されていない。」 ですね。 returnを追加した場合は以下のような処理になるかと思います。 1)gcd(45,60)とコール 2)gcd(60,45)とgcd(45,60)の中でコール 3)gcd(45,15)とgcd(60,45)の中でコール 4)gcd(45,15)から15がreturnされる 5)gcd(60,45)から15がreturnされる 6)gcd(45,60)から15がreturnされる 7)15がalertで表示される。 returnがない場合は5)の処理で戻り値として得た15はそのメソッド内で終了します。戻り値はありません(undef)。 さらに6)の処理でも戻り値がないのでundefになります。 よってalertには何も渡されずundefとだけ表示されます。 ※c++はあまり詳しくないのですがreturn文を省略した場合最終評価した値を自動的に戻り値にする言語は何種類か存在します:)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

if の一方で return してもう一方で return しないのはなぜ?

koun
質問者

お礼

回答ありがとうございます。c++で同じようにreturnなしで書いてみたのですが、正常に動作しました。どうしてJavascriptだとだめなのでしょうか?

関連するQ&A

  • ユークリッドの互除法

    ユークリッドの互除法の処方でつまづいています。 どなたか教えて頂けませんか。 aとbは正の整数でb≦aの関係にある。 aとbの最大公約数gcd(a,b)。 この時gcd(a,b)=ax+byの解となる(x,y)のペアはいくついるのでしょうか? 直感ですと(x,y)は一つしか存在しないように感じるのですが、どうやって記述すればいいのでしょうか? よろしくお願いします。

  • ユークリッドの互除法

    ユークリッドの互除法の証明の一部なのですが aをで割った商をbあまりをrとすると a=bq+r であるので r=a-bq である。ここで、この右辺はa bの最大公約数でわり切れるのは、なぜか教えて下さい。あと a bの最大公約数がrとb の公約数でもあるのはなぜですか?お願いします。

  • ユークリッド互除法

    ユークリッド互除法を使用して最大公約数を求めるプログラムを、C言語で書いてみました。 #include <stdio.h> main() { int a, b, t; scanf("%d %d", &a, &b); if(a<b){ t=a; a=b; b=t; } while(b != 0){ t = a % b; a = b; b = t; } printf("GCD = %d\n", a); return 0; } これを、もっと簡略化できるらしいのですが、これ以上できることはありますか? どう考えてもわかりません

  • ユークリッドの互除法

    ユークリッドの互除法がよくわかりません。 m>nとして(m=nならばm=gcd(m,n)) m=sn+t (n>t)とあらわせる。 ここでgcd(m,n)=gcd(n,t)となるのがわかりません。 これがわかったらあとはあまり部分が0になるまでやればそのときに最大公約数が出るというのはわかるのですが、、、

  • ユークリッドの互除法

    二つの整数a,bの最大公約数dを、ユークリッドの互除法で求める方法は分かります。 そうして求めたdは、適当な数x,yを使い、d=ax+byで表せることも何とか分かります。 しかし、d=ax+byが与えられたとき、ユークリッドの互除法を使って、特殊解xとyをどうやって求めたらよいのかが分かりません。 これまでの書き込みを見ても理解ができませんでした。 どなたか分かりやすくお教えください。

  • ユークリッドの互除法について

    質問させて頂きます。   (有理整数環Zにωを添付した整域Z[ω]をRとする。R=Z[ω]={a+bω}において) ω=(-1+√3i)/2 とした場合、α=16+14ω、β=11+9ω の最大公約元、最小公倍元の求め方をユークリッド互除法にて教えて下さい。 よろしくお願いいたします。

  • ユークリッドの互除法について

    こんにちは。高校数学A、ユークリッドの互除法についてです。 問題集の 整数aを正の整数bで割った余りをrとする。aとbの最大公約数はbとrの最大公約数と一致することを証明せよ。 という問題の解説で aをbで割った商をqとすると a=bq+r aとbの最大公約数をg1、bとrの最大公約数をg2とし、 a=a'g1,b=b'g1:b=b”g2,r=r'とする。 ただし、a',b',b”,r'は整数で、a'とb',b”とr'はそれぞれ互いに素である。このとき、 r=a-bq=a'g1-b'g1q=(a'-b'q)g1 a'-b'rは整数であるから、g1はrの約数、★すなわちbとrの公約数になる。 ★よってg1≦g2 以下略 この★の部分がわかりません。 g1がrの約数になると bとrの公約数とも言える理由は何なのでしょうか? そしてなぜg1よりg2のほうが大きくなるのでしょうか? どなたかよろしければ ご教授お願い致します。

  • ユークリッドの互除法の証明

    ユークリッドの互除法なんですが、これを使った証明がわからないので質問させてください。 a,bは正の整数で、b≦aである。 r_0=a、r_1=bとしq_iとr_iは整数で0<r_i<r_(i-1)である。(qについては特に指示はありません) このとき r_0=r_1*q_1+r_2 r_1=r_2*q_2+r_3 ・ ・ ・と続き r_(n-2)=r_(n-1)*q_(n-1)+r_n r_(n-1)=r_n*q_n が成り立つ。 n≧2の時、ユークリッドの互除法はgcd(a,b)=ax+byとなる整数(x,y)を持つことを証明しなさい。 これは帰納法を使えばいいのでしょうか? n=2の時にr_2=r_0-r_1*q_1が成り立つことはr_(n-1)=r_n*q_n にn=2を代入して示せるのですがn=k、n=k+1の時にどうすればうまく証明できるのかわかりません。 どなたか教えて下さい。

  • 高校数学A ユークリッドの互除法についてです。

    こんにちは。高校数学A、ユークリッドの互除法についてです。 問題集の 整数aを正の整数bで割った余りをrとする。aとbの最大公約数はbとrの最大公約数と一致することを証明せよ。 という問題の解説で aをbで割った商をqとすると a=bq+r aとbの最大公約数をg1、bとrの最大公約数をg2とし、 a=a'g1:b=b”g2,r=r'とする。 ただし、a',b',b”,r'は整数で、a'とb',b”とr'はそれぞれ互いに素である。このとき、 r=a-br=a'g1-b'g1q=(a'-b'q)g1 a'-b'rは整数であるから、g1はrの約数、★すなわちbとrの公約数になる。 以下略 この★の部分がわかりません。 g1がrの約数になると bとrの公約数とも言える理由は何なのでしょうか? どなたかよろしければ ご教授お願い致します。

  • ユークリッドの互除法についての問題です。

    ユークリッドの互除法についての問題です。 a,bが任意の整数のとき、次の式を満たす整数xは必ずあるか。 (1)aが5の倍数でないとき ax≡b (mod5) (2)aが4の倍数でないとき ax≡b (mod4) 誰か教えてください。