アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語です。
今パスカルの三角形を用いて(二次元配列を使う)nCrの値を求めるプログラムを作っているのですが、値を計算させる関数calがおかしいのか、実行しても値が0という数字にしかなりません。
どなたかご指摘をお願いします。
以下、ソースプログラムです。(main等は除きます)


int cal(int n, int r){

int p[100][100], i ,j;

for(i =0; i<n; i++){
for(j = 0; j<r-i; r++){
if(i == 0 ┃┃ j == 0)
p[i][j] = 1;
else
p[i][j] = p[i-1][j] + p[i][j-1];
}
}

return p[n][r];

}

見にくいかも知れませんが、携帯からの投稿なのでお許しください。

質問者からの補足コメント

  • 2つ目のfor文の中で、rをインクリメントしてますが、ここはjです。

      補足日時:2016/07/17 20:21

A 回答 (5件)

実装言語が何であるかは関係ありません。


 そしてプログラムは作られているとおりに動きます。思った通りには動きません。
 ということでアルゴリズムをしっかり確認しましょう。プログラム言語ではなく日本語で。

 ちなみにパッと目の疑問として、2段目のforループはrをインクリメントして回っていますがこれでよいのでしょうか?
 あと、配列pはこの関数内で定義するのではなく入力引数(呼び出し元がmain()ならmainで領域を確保し、その2次元配列のポインター渡し)なのでは?

参考まで。
    • good
    • 0

思い込みを捨てて、現状どんなプログラムになっているかを確かめてみましょう。




return の前に

for(i =0; i<=n; i++){
printf("%3d:",i):
for(j = 0; j<=n; j++){
if(i==n && j==r) {
printf("[%3d]",p[i][j]):
}else{
printf(" %3d ",p[i][j]):
}
printf("\n"):

とでも置いて
・pがパスカルの三角形になっているか?
・p[n][r]は、その表の何処なのか
を調べてみましょう。
    • good
    • 0

ぱっとみ、iもjもnやrに達しないのだから


return p[n][r];
で答えが返るわけないよね。
jの回し方も意味不明。

まずrを絡めずに回すアルゴリズムを
考えましょう。
    • good
    • 0

取りあえず正しい cal



int cal(int n, int r){

int p[100][100], i ,j;

for(i=0; i <= n; i++) {
for(j=0; j <= i; j++) {
if (j == 0 || j == i)
p[i][j]=1;
else
p[i][j]=p[i-1][j-1]+p[i-1][j];
}
}
return p[n][r];
}
    • good
    • 0

ちなみに、元ソースを見ると、「n行目r列目の特定の値を返したい」ように見えるんで、特にパスカルの三角形「そのもの」は返さなくても良いように見えます。


二次元配列を使わないで済むのなら、次のようにcalを定義する事が可能です。

int cal(int n, int r) {
 /* ここでパスカルの三角形の定義をそのまま書く */
 if (r == 0 || r == n)
  return 1;
 else
  return cal(n-1, r-1) + cal(n-1, r);
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!