0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C言語 再帰的に階乗を計算する

Last updated at Posted at 2020-03-05

正しくは、書き直した記事を上げました。こちらを参照ください。

C言語 階乗を求めるコード - Qiita
https://qiita.com/Kchan_01/items/594a49508d13999d0bb1

以下は記録用、間違ったコード

自分のコード(間違いがあります、詳しくはコメント欄を参照)

int factorial(int n){
    if(n > 0){
        return n * factorial(--n);
    } else {
        return n + 1;
    }
}

解説のコード

int factorial(int n){
    if(n == 1){
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

所感

※解釈に間違いがあったので、注釈やコメント欄を参照してください。

解説のコードn == 1というのが階乗のゴールを表していて、わかりやすい1。__ベースケース__を意識して書かれている。
最大の数、最小の数を意識して、全体像を見通して書くことで、綺麗に書ける。

自分のコードの場合は、階乗の0の場合もループしているので、ループの数が1回多くなっている。
そのため、return n + 1というイマイチな書き方になっている。

インクリメントで書くのもよいが2、この場合はn-1としたほうが、見た的にわかりやすかったと思う。

まとめ

再帰を使う場合は、関数を終了する停止点である__ベースケース__を意識すること。

  1. このコードは再帰をわかりやすく示すためにn == 1とされているが、実際再帰やループを使う処理は上限、下限で設定したほうが安全なコードが書ける。

  2. 副作用完了点を踏まえて書くようにとご指摘いただいた。インクリメント演算子を使用する場合は気をつける必要がある。

0
0
2

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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?