2008-10-26

http://anond.hatelabo.jp/20081025233759

Thanks. 確かにそうなんだけど、putsだと勝手に改行が出力されてしまうので一ヶ所しか使えなかった。DRY、forなし、ifなし(:?使ってるのでインチキだけど)、main以外に関数なし風味。これで完成ということにして寝ます。

int main() {
  int fizz_buzz(int i, int limit) {
    int do_fizz_buzz(int num, int divisor, const char* str, int print) {
      return num % divisor == 0 ? do_fizz_buzz(num / divisor, divisor, str, 1) : (printf("%s", print ? str : ""), num);
    }
    do_fizz_buzz(do_fizz_buzz(i, 3, "Fizz", 0), 5, "Buzz", 0) == i ? printf("%d\n", i) : puts("");
    return i++ == limit ? 0 : fizz_buzz(i, limit);
  }
  return fizz_buzz(1, 100);
}

移植性の話は厳禁でw

記事への反応 -
  • #include <stdio.h>int main(){ int i, j = 0; for(i=1; i<=100; j = 0, i++){ if(i % 3 == 0) { printf("Fizz"); j = 1; } if(i % 5 == 0) { printf("Buzz"); j = 1; } if (j) { printf("\n&quot...

    • フラグを導入するっていうのは一つの手だけど 今度はプログラム中でフラグを管理する必要が出てくるじゃない。 プログラムの中で管理する「状態」は極力減らせっていう鉄則 (何に書...

      • じゃぁ再帰で。 int fizz_buzz(int i, int j) { if(i % 3 == 0 && j % 3 != 0) { printf("Fizz"); return 1+ fizz_buzz(i / 3, j * 3); } if(i % 5 == 0 && j % 5 != 0) { printf("Buzz"); r...

        • さっきのはあまりに汚かったのでちゃんと書いたよ!! static int do_fizz_buzz(int num, int rem, const char* str, int print) { if (num % rem == 0) { return do_fizz_buzz(num / rem, rem, str, 1); } if (print) printf("%...

          • printf("%s", str); printf(str);又はputs(str); "%s"をパースする時間がもったいない とかどうでしょうか?

            • Thanks. 確かにそうなんだけど、putsだと勝手に改行が出力されてしまうので一ヶ所しか使えなかった。DRY、forなし、ifなし(:?使ってるのでインチキだけど)、main以外に関数なし風味。これで...

              • for を再帰で代替するなんて、どういうメリットがあるの?

                • for を再帰で代替するなんて、どういうメリットがあるの? 逆だよ。ループ構文が再帰の一種なの。 だから代替するってのはちょっと違う。

                  • ループが再帰処理の一種・・・? 再帰処理って処理を停止して新しい処理を行い、終了後に停止していた処理に戻ることじゃない? 処理A -> 処理B -> 処理A が再帰処理の名前の由来で...

                    • 元増田じゃないけど、LISPとかの話じゃないかな。 ループは再帰で実現できるけど、再帰はループで実現できない。だから論理的には、再帰の方がより一般的。(再帰さえあればOK) ただ...

                    • 「俺にとってはループの方が判りやすい」という主張は否定しないが。 再帰処理って処理を停止して新しい処理を行い、終了後に停止していた処理に戻ることじゃない? 処理A -> 処...

                      • 「末尾再起のある処理系なら」と付け加える必要があるのでは?

                      • よくわかってないならマジレスしなくていいよ。ネタじゃないし。 それは「関数呼び出し」じゃないかな? 言語によるのかも知れないが、私が触ってきた言語では全部自分自身を関数...

                        • 元増田と違う人かもしれないが、 言語によるのかも知れないが、私が触ってきた言語では全部自分自身を関数呼び出しすることを再帰と言っていた。 これには同意します。しかしな...

                          • プログラム構造のレベルでも、個人的な感覚の問題かもしれないが、再帰処理よりもループのほうがわかりやすい。 それで、元々のプログラムがループで記述されていた場合、わざわざ...

                            • 再帰ねー 木探索を簡潔に記述できる以外でループに勝る点なんかほとんど思いつかないんだけど 末尾再帰しかしないならループの方が簡潔だし、少なくともループの方が遅いことはない ...

                            • 最初のネタ扱いの書き方が失礼だったことは申し訳なかったですが、どうかカッカしないで欲しい...。 で、結局、何を「メリット」と考えるか、何を軸に「大小関係」を考えるのかがず...

                              • 別に怒っちゃいないよ。 表現力としても再帰処理よりループのほうが優秀だと思うな。 再帰処理はループ以外の処理もできるけれど、ループはループしかしないからね。 これが再帰...

                                • 再帰処理って処理を停止して新しい処理を行い、終了後に停止していた処理に戻ることじゃない? 処理A -> 処理B -> 処理A が再帰処理の名前の由来でしょ? 大はずれだろ。どこが「...

                                • 元エントリについている『大はずれだろ。どこが「名前の由来」やねん。』云々は別増田です (って言っても増田だから説得力ないかもしれませんが) さて、 表現力としても再帰処...

                        • 元エントリについている『大はずれだろ。どこが「名前の由来」やねん。』云々は別増田です 口調が違うのでわかります。 ちなみにそのエントリについてるエントリも私とは別増田で...

              • http://anond.hatelabo.jp/20081026002746 ステートマシン大好きっ子としては書かずにいられない もう少しがんばればforも無くせるな fsmの中身ってDRYなの?的な話もあるだろうが,こんなもの他の...

                • FizzBuzz続き Cにもlambdaがあればいいのに #include <stdio.h>#include <unistd.h>#define FALSE 0#define TRUE !FALSEtypedef struct state_t { int state; int num; int max; int outputted;} state_t;typedef struct fsm_t { ...

                  • なんでここまで簡単な要求を、ここまで複雑に書く必要があるのか、サッパリ理解できません。 それがプログラマというもの? だったら僕はプログラマになんかならなくてもいいや。

                  • じゃ、少しだけ本気出してみたよ。要求仕様にかなうといいんだけど。 #include <stdio.h>int main(void) { puts("1"); puts("2"); puts("Fizz"); puts("4"); puts("...

            • 後者がいいんじゃないかな。前者だと一部コンパイラだとセキュリティ警告が出ると突っ込まれるかもしれない。 この流れだとw

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん