再帰関数を学んでいます。Segmentation fault の理由


以下のコードは再帰関数を用いてmPnとmCnを計算し出力するプログラムです

Segmentation faultの箇所はコード4行目のn==m-nであることは分かっていますがなぜかが分かりません。どうすればプログラムを動かせますか？

[code]

    #include <stdio.h>
    
    int mpn(int m, int n){
      if(n==m-n){
        return 1;
      }
      return m*mpn(m-1, n);
    }
    
    int mcn(int n){
      if(n==1){
        return 1;
      }
      return n*mcn(n-1);
    } 
    
    int main(){
      int m, n, d;
      printf("input m and n:");
      scanf("%d %d", &m, &n);
      d=mpn(m, n);
      printf("%dP%d = %d\n", m, n, d);
      d=d/mcn(n);
      printf("%dC%d = %d\n", m, n, d);
      return 0;
    }
    
[/code]




処理系によっては `Segmentation fault` 表示になるでしょうし  
処理系によっては `Stack Overflow` 表示になるでしょう

要するに再帰の終了条件が誤っていて無限再帰しているだけです。今のコードは Permutation / Combination
の定義通りに実装されていませんよね。そこを直すだけ。

# 定義式通りに実装すると大きい数値を与えると即オーバーフローするので実用的にするには工夫が必要

