2017-11-20 46 views
2

こんにちはこれはパスカル三角形を計算するための私のコードですが、エラーを実行します。 私はそのエラーがパスカルの三角形をcで再帰関数を

#include <stdio.h> 

long paskal(int,int); 

int main (void) 
{ 
    int n = 0 ; 
    int m = 0 ; 
    int k = 0 ; 

    scanf("%d" , &n); 

    for(k = 1 ; n >= k ; ) 
    { 
     for( m = 1 ; k >= m ; m++) 
     { 
      long f = paskal(k , m) ; 
      printf("%ld" , f); 
     } 
     printf("\n"); 
     k++; 
    } 

    return 0; 
} 

long paskal(int n , int i) 
{ 
    if(n == 1 && i == 1) 
     return 1 ; 
    else 
     return paskal(n-1,i) + paskal(n-1,i-1); 
} 
+0

「khayam」は、「i」が「1」に等しくない場合には終了しません。あなたのロジックをチェックしてください。 –

+0

どうすればいいですか? –

+0

'for(m ...)'ループを使って連続した数字の間にスペースを追加することをお勧めします。次の改良されたバージョンでは、いくつかの垂直中心線に行を揃えようとするかもしれません(ただし、単一の数値幅の推定が必要です)。) – CiaPan

答えて

2

リミット条件が正しくないカーヤム機能であると思います。

制限条件を置くための正しい方法は、あなたがちょうど私>例を説明するために必要なnと、ここで、iまたはn = 0のように見えます

if(n == 1 || i == 1) 
    return 1 ; 
else 
    .... 
0

です:

あり
long paskal(int n , int i) 
{ 
if(i<0 || n<0 || i>n) return 0; 
if(n == 1) 
    return 1 ; 
else 

    return paskal(n-1,i) + paskal(n-1,i-1); 
} 
+0

このコードは、各行の中で最も高い数字に行くのではなく、数字の対称な "三角形"を作成します(1桁ではない数字間の分割を伝えるのは難しいかもしれません)。 – kylew

+0

不要です。しかし、予期せぬ条件のテストを主張する場合、なぜ否定的な値をテストしないのですか...? – CiaPan

0

再帰終了条件のようなコードにはほとんど問題はありません:

if(n == 1 && i == 1) 

機能を永遠に再帰的に導き、最終的にプログラムは異常終了します。あなたはこの条件を修正する場合main()forループの両方が、パスカル三角形のすべての行の最初の列を食べるようになる1でループ変数を初期化しているため

また、あなたが出力としてパスカル三角形を取得するつもりはありません。再帰関数paskal()の終了条件について

- 機能long paskal(int n , int i)

iは、その特定の行のカラムを表し、pascal()機能は、特定の要素を計算することになっているのに対し、nが行を表していますロケーション。

点のカップル、パスカルの三角形で:

  1. 各行の左端と右端の要素が1あります。

  2. すべての行には、行番号と同じ列数が含まれます。

だから、私が言うことができる -

if(n == i || i == 0) //i.e. if ((row == col) || (col == 0)) return 1; 
    return 1; 

は、再帰関数の状態を終了することができます。

#include <stdio.h> 

long paskal(int, int); 

int main() { 
    int n = 0; 
    int m = 0; 
    int k = 0; 
    int s = 0; 
    printf ("Enter number of rows:\n"); 
    scanf("%d", &n); 

    for(k = 0; n >= k; k++) { 
      for(s = 0; s < n-k; s++) //Add spaces before each row 
        printf(" "); 
      for(m = 0; k >= m; m++) { 
        long f = paskal(k, m); 
        printf("%ld ", f); 
      } 
      printf("\n"); 
    } 
    return 0; 
} 

long paskal(int n, int i) { 
     if(n == i || i == 0) 
       return 1; 
     else 
       return paskal(n-1, i) + paskal(n-1, i-1); 
} 

は、この情報がお役に立てば幸い:

総称して、あなたのプログラムは次のようなものになります。

関連する問題