LoginSignup
0
0

More than 3 years have passed since last update.

jsとhtmlでメモ化を実践

Posted at

お世話になっている本
もっとプログラマ脳を鍛える数学パズル(増井 敏克 (著))
です。ありがとうございます。

今回はその中の序章、メモ化を利用して席に座れる人数のMax値と人数を入力すると席に座る人が2人以上である座り方の組み合わせの数を教えてくれるwebアプリを作りました。
大人数で行ったときに便利ですね。(便利ではない)

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"/>
  <title>sample1</title>
</head>
<body>
  <form id="form1" action="#">
    <p>人数</p>
    <input type="text" id="input_message" value="">
    <p>テーブルmax</p>
    <input type="text" id="input_message2" value="">
    <input type="button" onclick="func1()" value="送信">
  </form>
  <div id="output_message"></div>
  <script language="javascript" type="text/javascript">
  function func1() {

    var N = document.getElementById("input_message").value;
    input = check(N,2);
    document.getElementById("output_message").innerHTML = input;
    //input = String(check(N,2,M));
  }


  var memo = {};
  function check(remain,pre){
    var M = document.getElementById("input_message2").value;
    //console.log("remain,pre:"+ remain,pre);
    if(memo[[remain,pre]]) return memo[[remain,pre]];

    if(remain < 0) return 0;
    if(remain == 0) return 1;

    var cnt = 0;
    for(var i =pre; i <= M; i++){
          cnt += check(remain -i,i);
          //console.log("cnt"+ cnt);
        }

    return memo[[remain,pre]] = cnt;
}
    func1();
  </script>
</body>
</html>

jsはしっかりと勉強したことはなかったのですが、変数の宣言とかがないのは楽だけどfunc1()みたいに言わないと実行しないことにずっと気づけなかったりしたのがちょっと大変だった。
メモ化っていうのは、実行時間を早めたり無駄を省くみたいでいろいろいじくりながら理解できた?
まあでもめちゃくちゃ回帰しててイメージとしては、組み合わせを調べるためにツリーを全部書いてるような気分。
もう一つ二重配列で考えるのがあってそっちの方が感覚的にはわかりやすかった。

あとはhtmlとくっつけるのが意外と大変。web系はあんまり興味なかったから。でも調べながらなんとかできて先人様様ありがとうございます。という感じです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0