ジェネレーターでいろいろな数列を発生させてみる。

# tl;dr
+ javascript には **イテレーター** という仕組みがある。
+ より簡単にイテレータを作る手段として **ジェネレーター関数**がある。
+ それを使えば、数列などを一個ずつ取り出す関数を簡単に実装することができる。

# ジェネレータの書き方

```javascript
// function* でジェネレータ関数を作成。
function* iterator() {
  let i = 0;
  yield i;

  for(let i = 0; i < 5; i++) yield ++a;
}

// ジェネレータ作成
let generator = iterator();

// .next() で次の yield まで実行
// result.done が true になるまで
do {
  const result = generator.next();
  console.log(result.value); //> 0 1 2 3 4
} while (!result.done)
```

# いろいろなgenerator作ってみた。

## 等差数列

`start`: スタートの数値
`end`: 上限値 (それ自身を含まない)
`step`: 増加量

<table>
<tr><th></th><th colspan="2">param</th><th></th></tr>
<tr><td rowspan="3"></td><td><strong>start</strong></td><td><code>0       <code></td><td rowspan="3">$ 0, 1, 2, 3, \cdots $</tr>
<tr><td><strong>end  </strong></td><td><code>Infinity<code></td></tr>
<tr><td><strong>step </strong></td><td><code>1       <code></td></tr>
<tr><td rowspan="3"></td><td><strong>start</strong></td><td><code>5       <code></td><td rowspan="3">$ 5, 13, 21, 29 $</tr>
<tr><td><strong>end  </strong></td><td><code>30      <code></td></tr>
<tr><td><strong>step </strong></td><td><code>8       <code></td></tr>
<tr><td rowspan="3"></td><td><strong>start</strong></td><td><code>0        <code></td><td rowspan="3">$ 0, -5, -10, -15, \cdots $</tr>
<tr><td><strong>end  </strong></td><td><code>-Infinity<code></td></tr>
<tr><td><strong>step </strong></td><td><code>-5       <code></td></tr>
</table>

<p data-height="265" data-theme-id="dark" data-slug-hash="XodgNe" data-default-tab="js,result" data-user="lemon2003" data-pen-title="等差数列" data-preview="true" class="codepen">See the Pen <a href="https://codepen.io/lemon2003/pen/XodgNe/">等差数列</a> by lemon2003 (<a href="https://codepen.io/lemon2003">@lemon2003</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 三角数

<table>
<tr><td colspan="2" style="text-align: center">1</td><td colspan="2" style="text-align: center">3</td><td colspan="2" style="text-align: center">6</td><td colspan="2" style="text-align: center">10</td><td colspan="2" style="text-align: center">15</td><td style="text-align: center">…</tr>
<tr><td></td><td colspan="2" style="text-align: center">+2</td><td colspan="2" style="text-align: center">+3</td><td colspan="2" style="text-align: center">+4</td><td colspan="2" style="text-align: center">+5</td><td colspan="2" style="text-align: center">…</td></tr>
</table>

<p data-height="265" data-theme-id="dark" data-slug-hash="BvKJmd" data-default-tab="js,result" data-user="lemon2003" data-pen-title="三角数" data-preview="true" class="codepen">See the Pen <a href="https://codepen.io/lemon2003/pen/BvKJmd/">三角数</a> by lemon2003 (<a href="https://codepen.io/lemon2003">@lemon2003</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 等比数列

`n`: 前後の比

<table>
<tr><th></th><th colspan="2">param</th><th></th></tr>
<tr><td></td><td><strong>n</strong></td><td><code>2</code></td><td>$ 1, 2, 4, 8, \cdots $</td></tr>
<tr><td></td><td><strong>n</strong></td><td><code>3</code></td><td>$ 1, 3, 9, 27, \cdots $</td></tr>
<tr><td></td><td><strong>n</strong></td><td><code>10</code></td><td>$ 1, 10, 100, 1000, \cdots $</td></tr>
</table>

<p data-height="265" data-theme-id="dark" data-slug-hash="roepzo" data-default-tab="js,result" data-user="lemon2003" data-pen-title="等比数列" data-preview="true" class="codepen">See the Pen <a href="https://codepen.io/lemon2003/pen/roepzo/">等比数列</a> by lemon2003 (<a href="https://codepen.io/lemon2003">@lemon2003</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 階乗

<table>
<tr><th colspan="2" style="text-align: center">0!</th><th colspan="2" style="text-align: center">1!</th><th colspan="2" style="text-align: center">2!</th><th colspan="2" style="text-align: center">3!</th><th colspan="2" style="text-align: center">4!</th><th colspan="2" style="text-align: center">5!</th><th style="text-align: center">…</th></tr>
<tr><td colspan="2" style="text-align: center">1</td><td colspan="2" style="text-align: center">1</td><td colspan="2" style="text-align: center">2</td><td colspan="2" style="text-align: center">6</td><td colspan="2" style="text-align: center">24</td><td colspan="2" style="text-align: center">120</td><td style="text-align: center">…</tr>
<tr><td></td><td colspan="2"></td><td colspan="2" style="text-align: center">*2</td><td colspan="2" style="text-align: center">*3</td><td colspan="2" style="text-align: center">*4</td><td colspan="2" style="text-align: center">*5</td><td colspan="2" style="text-align: center">…</td></tr>
</table>

<p data-height="265" data-theme-id="dark" data-slug-hash="ZVWvvm" data-default-tab="js,result" data-user="lemon2003" data-pen-title="階乗" data-preview="true" class="codepen">See the Pen <a href="https://codepen.io/lemon2003/pen/ZVWvvm/">階乗</a> by lemon2003 (<a href="https://codepen.io/lemon2003">@lemon2003</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## フィボナッチ数列

`n`: 何個前までの値を参照するか

<table>
<tr><th></th><th colspan="2">param</th><th></th></tr>
<tr><td></td><td><strong>n</strong></td><td><code>2</code></td><td>$ 0, 1, 1, 2, 3, 5, 8, 13, \cdots $</td></tr>
<tr><td></td><td><strong>n</strong></td><td><code>3</code></td><td>$ 0, 0, 1, 1, 2, 4, 6, 12, \cdots $</td></tr>
<tr><td></td><td><strong>n</strong></td><td><code>4</code></td><td>$ 0, 0, 0, 1, 1, 2, 4, 8, \cdots $</td></tr>
</table>

<p data-height="265" data-theme-id="dark" data-slug-hash="jXqYyZ" data-default-tab="js,result" data-user="lemon2003" data-pen-title="Nフィボナッチ数列" data-preview="true" class="codepen">See the Pen <a href="https://codepen.io/lemon2003/pen/jXqYyZ/">Nフィボナッチ数列</a> by lemon2003 (<a href="https://codepen.io/lemon2003">@lemon2003</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 見て言って数列

`1`: *One one*
`11`: *Two one*
`21`: *One two, One one*
`1211`: *One one, One two, Two one*
`111221`: *Three one, Two two, One one*
`312211`: *One three, One one, Two two, Two one*
`13112221`: *One one, One three, Two one, Three two, One one*
`1113213211`: *Three one, One three, One two, One one, One three, One two, Two One*
`31131211131221`: *One three, Two one, One three, One one, One two, Three one, One three, One one, Two two, One one*
`13211311123113112211`: *One one, One three, One two, Two one, One three, Three one, One two, One three, Two one, One three, Two one, Two two, Two one*

<p data-height="265" data-theme-id="dark" data-slug-hash="NeNXyX" data-default-tab="js,result" data-user="lemon2003" data-pen-title="見て言って数列" data-preview="true" class="codepen">See the Pen <a href="https://codepen.io/lemon2003/pen/NeNXyX/">見て言って数列</a> by lemon2003 (<a href="https://codepen.io/lemon2003">@lemon2003</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 終わりに
使うタイミングが頻繁にあるかどうかで言うと微妙ですが、知っておいて損はないと思います。