C言語関係掲示板

過去ログ

No757 正三角形を表示する再帰関数

[戻る] [ホームページ]
No.9408

再帰について教えてください
投稿者---takasi(2003/09/23 04:08:51)


一辺の長さ Aとする ある文字でできた正三角形を表示する再帰関数triを書け。辺の長さ、表示文字の2つを引数とする。
たとえば、tri(4,'X')は次のような表示をする。
X
XXX
XXXXX
XXXXXXX

この問題に苦戦いたしております。分かる方がいましたら助言ください。

No.9415

Re:再帰について教えてください
投稿者---物見遊山(2003/09/23 15:54:18)


一応書いてみました。
staticで内部変数を定義しているのがミソ?です。
(他にもっと良い方法があるのかもしれませんが)

・・・普通再起関数内でstatic変数って使いませんよね?

#include <stdio.h>

void
tri(int t, int ch)
{
    static int space;
    int i;

    if (1 < t) {
        space++;
        tri(t - 1, ch);
    }

    for (i = 0; i < space; i++)
        putchar(' ');
    for (i = 0; i < t * 2 - 1; i++)
        putchar(ch);
    puts("");
    space--;
}



No.9416

Re:再帰について教えてください
投稿者---たか(2003/09/23 16:54:56)


これでいかがでしょうか。

#include <stdio.h>

void tri(int i, char c);

int main(void)
{
  int i;
  
  for (i = 1; i < 5; i++) {
    printf("i = %d\n", i);
    tri(i, 'X');
  }

  return 0;
}

void tri(int i, char c)
{
  int j;
  
  if (i == 0) return;
  else {
    tri(i - 1, c);
    for (j = 0; j < i * 2 - 1; j++) putchar(c);
    putchar('\n');
  }
}


No.9417

Re:再帰について教えてください
投稿者---物見遊山(2003/09/23 17:30:38)


>これでいかがでしょうか。

質問された方の要求は
>>たとえば、tri(4,'X')は次のような表示をする。 
>>    X
>>   XXX
>>  XXXXX
>> XXXXXXX

ということらしいです。
線対称の三角形なのです。はい。
(タグも変換ツールも使ってないのでわかりづらいのですが)

ちゃちゃでゴメンなさい。

No.9418

Re:再帰について教えてください
投稿者---たか(2003/09/23 17:45:47)


>質問された方の要求は
><pre>>>たとえば、tri(4,'X')は次のような表示をする。
>> X
>> XXX
>> XXXXX
>> XXXXXXX
</pre>
>ということらしいです。
>線対称の三角形なのです。はい。
>(タグも変換ツールも使ってないのでわかりづらいのですが)
>
>ちゃちゃでゴメンなさい。

うーんそうなるとやはり単一の関数ではstatic変数を使うか、孫請け再帰
関数が必要になりますね。引数まで制限されているんじゃ仕方ありません。

何かいい方法がないものか・・・・・

No.9419

Re:再帰について教えてください
投稿者---たか(2003/09/23 17:55:46)


結局孫請け関数を使ってこういうインチキをする事になるのですが・・・
ダメですかね?

#include <stdio.h>

void tri(int i, char c);
void tri2(int i, int j, char c);

int main(void)
{
  int i;
  
  for (i = 1; i < 5; i++) {
    printf("i = %d\n", i);
    tri(i, 'X');
  }

  return 0;
}

void tri(int i, char c)
{
  tri2(i, i, c);
}

void tri2(int i, int j, char c)
{
  int k;
  
  if (j == 0) return;
  else {
    tri2(i, j - 1, c);
    for (k = 0; k < i - j; k++) putchar(' ');
    for (k = 0; k < j * 2 - 1; k++) putchar(c);
    putchar('\n');
  }
}


No.9428

Re:再帰について教えてください
投稿者---たいちう(2003/09/24 10:49:18)


>ダメですかね?

ダメでしょう。再帰関数triを書けとあるので。
問題自体がよくないですね。
「正三角形」と呼ぶのもひっかかる。

# さらに脱線しますが、再帰関数の初心者向けの例題に
# ろくなものはないですね。この例や階乗、フィボナッチ数列
# などの定番は再帰を使う必要が全くない。
# ハノイの塔はうまく使えてますが、マイナー。
# なんかいい題材はないのでしょうか。

No.9421

Re:再帰について教えてください
投稿者---かずま(2003/09/23 19:37:11)


> staticで内部変数を定義しているのがミソ?です。
> (他にもっと良い方法があるのかもしれませんが)

第1引数に 2つの値を持たせるというインチキをすれば、こうなりました。
void tri(int n, int c)
{
    int i = (n & 255) << 1;
    if (i > 2) tri(n + 255, c);
    printf("%*s", n >> 8, "");
    while (--i > 0) putchar(c);
    putchar('\n');
}


No.9433

ありがとうございます
投稿者---takasi(2003/09/24 17:16:17)


みなさんに考えていただいたプログラムを参考にせせていただき、がんばって解いてみようと思います。

No.9437

Re:再帰について教えてください
投稿者---物見遊山(2003/09/25 12:33:15)


>        int i = (n & 255) << 1;
(かずまさんのソースを動かしてみる)
あー。なるほど・・・。色々と勉強になりました。

あと、printf(3)の小ネタもいただきます。

No.9438

Re:再帰について教えてください
投稿者---たか(2003/09/25 17:16:07)


>第1引数に 2つの値を持たせるというインチキをすれば、こうなりました。

なるほどねえ。こりゃすごいです。感心しました。