> For the complete documentation index, see [llms.txt](https://kurohasu.gitbook.io/fsharpabout/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kurohasu.gitbook.io/fsharpabout/functions/rec.md).

# 再帰的に関数を呼び出す

### 再帰関数とは？

プログラミングにおいて関数の中で自分自身を呼び出す関数のことを指します\
ループ構文よりも強力な繰り返し手法で、ループ構文で書くのが難しいような処理を簡潔に行うことができ問題を繰り返し処理することで解決する場合に非常に有用です\
また複数の関数を再帰的に呼び出し合う「相互再帰」もサポートしています。\
（そこまで使用されませんが...）

```
構文:let rec 再帰関数名(引数)=
        処理...
        
呼び出し:再帰関数名(引数)


構文:let rec 相互再帰1(引数)=
        処理...
        
    and 相互再帰n(引数)=
        処理...
        
呼び出し:再帰関数(引数)
```

### 例

```fsharp
//1 階乗(n!)を計算する
let rec fact(n)=
    if n=1||n=0 then    
        1
    else
        n*fact(n-1)    //n=5->5*fact(4)を計算する
        
//呼び出し(5!を計算)
let num=fact(5)
```

```fsharp
//コラッツの問題(偶数なら2で割る、奇数なら3倍して1足す を繰り返す)
let rec collatz(x)=
    if x=1 then 0    //xが1なら抜ける
    match (x%2) with    //2で割った余りで分岐
        |0->collatz(x/2)
        |1->collatz(x*3+1)
        
//呼び出し
let num=collatz(15)
```
