• ベストアンサー

ユークリッドの互除法

ユークリッドの互除法を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となってしまいます。どうしたら正確な答えが出るでしょうか?

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

  • ベストアンサー
  • 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

専門家に質問してみよう