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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1250閲覧

Ruby -> JavaScript 「翻訳」がうまくいきません

kyk

総合スコア7

Ruby

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/07/21 06:13

編集2016/07/21 07:20

ある金額について日本円の硬貨の組み合わせで何パターン作れるか、というアルゴリズムについて。
ネットで見つけたRubyの模範回答を学習しながらJavaScriptに移植しようとしています。
自分では正しく「翻訳」したつもりが、同じ数値で実行しても挙動が一致せず、悩んでいます。

Forループで再帰する際のカウンターのあたりがRubyとJavaScriptで違うような気がしてはいるのですが、
根本原因がわかっておりません。

ご存知の方、教えていただけると幸いです。よろしくお願いいたします。

Ruby

1**////////////////////////////Ruby 模範コード////////////////////////////** 2@cnt = 0 3 4def change(target, coins, usable) 5 coin = coins.shift 6 if coins.size == 0 then 7 @cnt += 1 if target / coin <= usable 8 else 9 x = target/coin 10 for i in 0..x do 11 minus = coin * i 12 tmp = target - minus 13 z = coins.clone 14 change(tmp, z, usable - i) 15 end 16 end 17end 18 19L_coins = [500, 100, 50, 10,5,1] 20limit = 1000 21N = 50 22 23change(N, L_coins, limit) 24 25puts @cnt

JavaScript

1**////////////////////////////JavaScript コード案////////////////////////////** 2 3 4 5cnt = 0 6 7function change(target, coins, usable){ 8 coin = coins.shift(); 9 10 if (coins.length == 0){ 11 add = Math.floor(target / coin) <= usable ? 1 : 0; 12 cnt = cnt + add; 13 }else{ 14 N = parseInt(target/coin); 15 for(i=0;i<=N;i++){ 16 clone = coins.slice(0); 17 tmp = target - (coin * i); 18 change(tmp, clone, usable - i); 19 } 20 } 21} 22 23 24L_coins = [500, 100, 50, 10,5,1]; 25limit = 1000; 26N = 50; 27 28change(N, L_coins, limit); 29console.log(cnt); 30

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

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

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

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

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

otn

2016/07/21 06:41

コードを```Rubyと```、および```JavaScriptと```という行で囲んで下さい。またインデントをつけて下さい。
kyk

2016/07/21 07:21

ご教示ありがとうございました。 質問文内のコードをオートフォーマットしてくれる機能があるんですね。勉強になりました!
guest

回答1

0

ベストアンサー

JavaScriptはRubyと違ってvarで変数を宣言しなければいけません。Rubyの場合はローカル変数だったために上手く動いていたものが、JavaScriptに翻訳したものでは全てグローバル変数になってしまっているため正しく動かなくなっていました。

正しく直したコードを貼っておきます。

JavaScript

1var cnt = 0 2 3function change (target, coins, usable) { 4 var coin = coins.shift(); 5 6 if (coins.length == 0) { 7 var add = Math.floor(target / coin) <= usable ? 1 : 0; 8 cnt = cnt + add; 9 } else { 10 var N = Math.floor(target / coin); 11 for (var i = 0; i <= N; i++) { 12 var clone = coins.slice(0); 13 var tmp = target - (coin * i); 14 change(tmp, clone, usable - i); 15 } 16 } 17} 18 19var L_coins = [500, 100, 50, 10,5,1]; 20var limit = 1000; 21var N = 50; 22 23change(N, L_coins, limit); 24console.log(cnt);

また、この場合cntはグローバル変数になっていますが、返り値を使って表現した方が綺麗に書けます。

JavaScript

1function change (target, coins, usable) { 2 var coin = coins.shift(); 3 4 if (coins.length == 0) { 5 return Math.floor(target / coin) <= usable ? 1 : 0; 6 } else { 7 var N = Math.floor(target / coin); 8 var cnt = 0; 9 for (var i = 0; i <= N; i++) { 10 var clone = coins.slice(0); 11 var tmp = target - (coin * i); 12 cnt += change(tmp, clone, usable - i); 13 } 14 return cnt; 15 } 16} 17 18var L_coins = [500, 100, 50, 10,5,1]; 19var limit = 1000; 20var N = 50; 21 22var cnt = change(N, L_coins, limit); 23console.log(cnt);

投稿2016/07/21 07:03

MakeNowJust

総合スコア545

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

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

kyk

2016/07/21 07:23

早速のご教示ありがとうございました! varはあってもなくてもいいもの、くらいの甘い認識でおりました。 また返り値を使う方法もご指摘通りとてもスマートと思います。 勉強になります。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問