パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

再帰呼び出し、よく使う?使わない?」記事へのコメント


  • /* どうちがうのか、自分には全くわからない。gotoは0引数の自分への再帰でしょう? */
    /* 末尾最適化できないのはコンパイラかプログラマがタコなだけ。 */

    #include <stdio.h>
    int x=0;
    int main(){
    main:
      x++;
      printf("%d\n",x);
      if(x<100){
        goto main;
      }else{
        exit 0;
      }
    }

    #include <stdio.h>
    int x=0;
    int main(){
      x++;
      printf("%d\n",x);
      if(x<100){
        main();
      }else{
        exit 0;
      }
    }

    --
    新人。プログラマレベルをポケモンで言うと、コラッタぐらい
    • by Anonymous Coward

      同じ結果になるように実装しているのだから、どう違うのかといえば違いませんな。

      コードについて言えば...
      int x を (static な生存期間をもつ現在位置ではなくて) auto な生存期間のものにするともうちょっと違う鴨。
      C (なのかな、exit がそう書けるかどうか...?)だと main の引数は変更できないから(※1)別の関数名にする必要があり、
      さらに脱出に exit 以外のものを使用する必要がありますが。

      コンパイラがそう最適化するはず/べきだ、という話であれば、
      極端に話「学生に数字を列挙せよ」というところからプログラミングといってるのと同じで話してるレベルがちょいと違う。
      (学生が理解できないのは学生がタコなだけ、ですし)

      ※1 あーフリースタンディング環境がどうとかいう話は別でお願いね ^_-☆

    • by Anonymous Coward

      その例だったら前者の方がマシだと思います。
      まぁ、コンパイル通らないけど。

      • by Anonymous Coward

        だれもC言語とは言っていない

        • by Anonymous Coward

          じゃあ、何言語か教えてください :)

    • by Anonymous Coward

      //それはなんの例示なの?
      //ふつうこうじゃない?

      #include

      int main() {
                      int x = 0;
                      while(++x = 100)
                                      printf("%d\n", x);
                      return 0;
      }

      • by Anonymous Coward

        ちょー上からコメントしたくせに投稿したら比較演算子が消えちまった。
        これははずかしい…

    • by Anonymous Coward

      さすがコラッタ

      • by Anonymous Coward

        コラッタへの熱い風評被害

    • by Anonymous Coward

      gotoで作るループを再帰ととらえる人がいるのはちょっとした驚きです。

      • by Anonymous Coward

        逆、gotoによる繰り返しをループと呼んでいるんだよ。
        まぁ再帰の方も引数無しの広域変数で再起抜けてたり、exit(一般的には関数からのリターンではなくプログラムの終了)だと呼び出し元もクソもねぇだろとか色々しっくりこないわけですが。

    • by Anonymous Coward


      /* どうちがうのか、自分には全くわからない。gotoは0引数の自分への再帰でしょう? */
      /* 末尾最適化できないのはコンパイラかプログラマがタコなだけ。 */

      確かに。


      $ cat doloop.c
      #include <stdio.h>
      int x=0;
      int main(){
          do {
              x++;
              printf("%d\n",x);
          } while(x<100);
      }

      $ cat goto.c
      #include <stdio.h>
      int x=0;
      int main(){
      main:
          x++;
          printf("%d\n",x);
          if(x<100){
              goto main;
          }
      }

      $ cat recursive.c
      #include <stdio.h>
      int x=0;
      int main(){

アレゲは一日にしてならず -- アレゲ見習い

処理中...