開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- 参考書籍
普通は変数定義してじゃないの?
— ABAB↑↓BA (@ababupdownba) 2017年6月9日
Vim script だと C++ と同じように変数定義しないと出来なかった
— バンビちゃん@実際社会不適合者 (@pink_bangbi) 2017年6月9日
let Fact = 0
let Fact = { n -> n > 1 ? Fact(n - 1) * n : n }
echo Fact(3)
echo Fact(5)
各言語の『無名関数で再帰するコード』に興味がある
— バンビちゃん@実際社会不適合者 (@pink_bangbi) 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 コメント:
コメントを投稿