開発環境
- 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 コメント:
コメントを投稿