アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (3件)

既に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))とか答えが一発で出るような物であれば正常に動くのではないでしょうか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/13 21:30

回答の補足の使い方がわからないので新規回答ですいません…。




>回答ありがとうございます。確かに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文を省略した場合最終評価した値を自動的に戻り値にする言語は何種類か存在します:)
    • good
    • 0

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

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

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

お礼日時:2013/02/13 21:24

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