LoginSignup
0
1

More than 1 year has passed since last update.

スプレッドシートで再帰関数を作る

Posted at

名前付き関数

スプレッドシートで名前付き関数が使えるので再帰関数も作れるよっていうお話です。


適当な例

階乗

$$
6! = 6 \cdot 5 \cdot 4 \cdot 3 \cdot 2 \cdot 1 = 720
$$

みたいなやつです。
スプレッドシートにも一緒の関数があるので作る必要はないですが、下記のような感じで作れます。
FACTだと名前がかぶって怒られるので適当な関数名で。

FACT_OWN(n)

=IF(n=1, 1, n*FACT_OWN(n-1))

階乗.png


素数

素数を判定する関数。
もっといいやり方ありそうですが。
素数を判定する関数

ISPRIME(n,k)

=IF(k<1, FALSE, IF(k = 1, TRUE, AND(MOD(n,k)<>0, ISPRIME(n,k-1))))

素数を取得する関数
GETPRIME(n)

=IF(n<2,"",SPLIT(REDUCE("",SEQUENCE(n-1,1,2,1), lambda(res, cur, IF(ISPRIME(cur, INT(SQRT(cur))), res&","&cur, res))),","))

素数.png


フィボナッチ数

普通に再帰関数でやると30ぐらいからできませんね。
たぶん、アルゴリズムを改善すればいけるかもですが、ここは一般解に逃げます。
(再帰関数関係なくなっちゃいましたが)

a_n = \frac{1}{\sqrt{5}} \left\{ \left(\frac{1+\sqrt{5}}{2}\right)^n - \left( \frac{1-\sqrt{5}}{2} \right)^n \right\}

fibonacci.png

むむむ、大きい項の値がおかしいですね。
なんでだろう。だれか教えてください。

ちなみに再帰関数で計算している方は、#ERROR!の箇所で
「この数式の計算中に計算の上限に達しました。」
というエラーメッセージが表示されています。


さいごに

こんかいは簡単な紹介だけでした。
いろいろできそうな可能性を感じますが、計算の上限とか制限もありそうですね。
でも再帰関数の計算も割と早いので、スプレッドシートでできるものはGASでやるよりいいかもしれないですね!


参照

名前付き関数の作成と使用

0
1
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
1