2017年6月9日金曜日

開発環境

JavaScript だとどんな感じになるか、コードを書いてみた。(無名関数、高階関数(第一級関数、関数の引数に関数を指定できる言語なら似たような感じのコードで可能。)

コード(Emacs)

HTML5

<pre id="output0"></pre>
<label for="n0">n = </label><input id="n0" min="0" step="1" type="number" value="10">
<button id="run0">run</button>
<button id="clear0">clear</button>

<script src="sample12.js"></script>    

JavaScript

let pre0 = document.querySelector('#output0'),
    btn0 = document.querySelector('#run0'),
    btn1 = document.querySelector('#clear0'),
    input_n = document.querySelector('#n0'),
    inputs = [input_n],
    p = (x) => pre0.textContent += x + '\n';

// 再帰関数
let factorialWithRecursive1 = (n) => n <= 1 ? 1 : n * factorialWithRecursive1(n - 1);

// 省メモリー版
let factorialWithRecursive2 = (n) => {
    let inner = (i, result) => i > n ? result : inner(i + 1, i * result);

    return inner(1, 1);
};

// for loop
let factorialWithForLoop = (n) => {
    let result = 1;
    for (let i = 2; i <= n; i += 1) {
        result *= i;
    }
    return result;
};

let output = () => {
    let n = parseInt(input_n.value, 10);

    p(`${n}! = ${factorialWithRecursive1(n)}`);
    p(`${n}! = ${factorialWithRecursive2(n)}`);
    p(`${n}! = ${factorialWithForLoop(n)}`);

    // 無名関数の再帰(arrow functionsで)
    let result1 = ((n) => ((factorial) => factorial(factorial, n)
                          )((factorial, m) =>
                            m === 1 ? 1 : m * factorial(factorial, m - 1))
                  )(n);

    // 無名関数の再帰(return文を省略しない arrow functionsで)
    let result2 = ((n) => {
        return ((factorial) => {
            return factorial(factorial, n);
        })((factorial, m) => {
            return m === 1 ? 1 : m * factorial(factorial, m - 1);
        });
    })(n);

    // 無名関数の再帰(function を使用)
    let result3 = (function (n) {
        return (function (factorial){
            return factorial(factorial, n);
        })(function (factorial, m) {
            return m === 1 ? 1 : m * factorial(factorial, m - 1);
        })
    })(n);
    
    p(`${n}! = ${result1}`);
    p(`${n}! = ${result2}`);
    p(`${n}! = ${result3}`);
}

let clear = () => pre0.textContent = '';

inputs.forEach((input) => input.onchange = output);
btn0.onclick = output;
btn1.onclick = clear;

output();







  







						

0 コメント:

コメントを投稿