2008-10-25

http://anond.hatelabo.jp/20081025230447

じゃぁ再帰で。

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");
    return 1 + fizz_buzz(i / 5, j * 5);
  }
  return 0;
}

int main(){
  int i;
  for(i=1; i<=100; i++){
    if(fizz_buzz(i, 1))
      printf("\n");
    else
      printf("%d\n", i);
  }
  return 0;
}

変数適当なのは勘弁。3とか5は適当に定数かマクロで置換すればDRY?

散々考え尽くされているんだろうけど、俺は挑戦するの初めてなので結構楽しいw

記事への反応 -
  • 私は今某社でWebアプリ開発の補助をするアルバイトをしている。一応少しはコードを書く。でも、自分はプログラマじゃないな、と思う。素敵なアルゴリズムを考えたりもしない。アプリ...

    • http://anond.hatelabo.jp/20081025202001 のコード見ると 3と5の除余判定を2度やってるでしょ。これって1回にまとめられないかな。 いや、別に2回処理やっても良いんだけど、 「3じゃなくて4に...

      • #include &lt;stdio.h&gt;int main(){ int i, j = 0; for(i=1; i&lt;=100; j = 0, i++){ if(i % 3 == 0) { printf(&quot;Fizz&quot;); j = 1; } if(i % 5 == 0) { printf(&quot;Buzz&quot;); j = 1; } if (j) { printf(&quot;&#92;n&quot...

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

          • じゃぁ再帰で。 int fizz_buzz(int i, int j) { if(i % 3 == 0 &amp;amp;&amp;amp; j % 3 != 0) { printf(&quot;Fizz&quot;); return 1+ fizz_buzz(i / 3, j * 3); } if(i % 5 == 0 &amp;amp;&amp;amp; j % 5 != 0) { printf(&quot;Buzz&quot;); 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(&quot;%...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      • 全然DRYじゃないけど、 #include &lt;stdio.h&gt;#define FIZZ 3#define BUZZ 5int main(void){ int i; for(i=1; i&lt;=100; i++){ if((i % FIZZ == 0) || (i % BUZZ == 0)){ if(i % FIZZ == 0) printf(&quot;Fizz&quot;); if(i % BUZZ =...

    • main(void)とか、intの関数のくせにreturn値なしとか、ふざけてるの?死ぬの? とか思ったがそれは置いといて。 アホか。 勉強しなきゃならないのはどんな職業でも一緒だよ。そんなのバイ...

      • C99及びC++では値を返さなければ0を返したことになるんだな。 死んじゃうのはあなたのほうかもしれないよ。

        • 嘘言うな。 X3010 105頁 6.8.6.4、79頁6.6.3 2節には 「戻り値の型がvoid(値を返さない)と定義されている場合を除いて、式の省略はできない」 と書かれてるぞ。 おい、お前の言ってる0を返すっ...

          • まず、1999年版を見てるよな?C90じゃなく。 で本題だが、main関数についての特例があるからもっとよく読んでご覧。

            • 補足。C++(14882:2003)だと、3.6.1の5に書いてある。 Cはいま手元にないので自分で探してね。

            • ソース出せという問いに、その反応で満足するやつはプログラマじゃないな。 で、俺は思うんだが元増田がC99あるいはC++であるという根拠は全く無いし、業界標準であるgccだってC99準拠...

              • やれやれ、面倒くさい子だね。Cのpdfを眺めてみたよ。9899:1999の5.1.2.2.3に載ってるから確認してくださいな。 GCCについてはここを見てね。http://gcc.gnu.org/c99status.html 鼻息荒いからからかっ...

                • 別増田なんだけど、戻り値無くてもいいとは言われても、世に出てるコンパイラの殆どが警告出すんじゃないの? gccもVC++も出すよね。 警告無視派?「linuxカーネルなんて何百行警告出る...

                  • 警告無視派じゃないよ。むしろ警告をエラーとして扱う派。 int main() {} については、g++だと-Wall -Wでも警告なし、gccだと警告あり、gcc -std=c99だと-Wall -Wでも警告なし、ですね。

                    • ええええええーー じゃあ、gccで警告出るんだから、エラー扱いしろよ。 何擁護してるの?バカなの、やっぱり死ぬの?

                      • だからね、あなたにとっては古いCが世界の全てかもしれないけれど、世の中全てのひとがそうじゃないんだよ、前提はいろいろなんだよ、と言ってるわけ。 多様な前提を許容していない...

                      • だからね、あなたにとっては古いCが世界の全てかもしれないけれど、世の中全てのひとがそうじゃないんだよ、前提はいろいろなんだよ、と言ってるわけ。 多様な前提を許容していない...

    • 向いてないことに早めに気付けて、よかったんじゃないの 自分の適性にあわないことを続けてもねぇ。。。

    • あの…、なんかmain()の仕様で熱くなってる人が居るところ申し訳ないんですけど このFizzBuzz、仕様満たしてないようなきがするんですけど、そこは突っ込まないんですか。

      • すばらしい指摘すぎて全俺が泣いた。 Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of bot...

    • これはwwwww。 mainで議論してるやつ恥ずかしいwwww なんで気づかないのm9(^Д^)

    • そして元増田はDNBK

    • http://anond.hatelabo.jp/20081025202001 トラックバック熱いなーw

    • まあトラバが示しているようにどうでもいい事で悩みこむ性格じゃないとダメだから、むしろなれないほうがいいかもね。 あと、別にコーダでも会社や社会の役に立つし、優秀なプログ...

      • ただ、コーダとなると、韓国人やらインド人やらが幅を利かせてるから、日本人じゃそもそも仕事が取れないわけで。 最低でもプログラマにならないと、そもそも仕事ないんだよ。 特に...

    • javascript ではこうか、こうでいいのか? window.onload = function() { for(var ix = 0; ix &lt; 100; ix++) { var p = document.createElement(&quot;p&quot;); var text = ix + &quot; : &quot; + fizzBuzz(ix); var textNode = document.cre...

      • いいけど、ifなしforなしfunctionなしで書けたらもっとカコイイ

        • function はなしにできるけど、可読性のためにあったほうがいい。 私なら内部関数にしてでも切り離す。 if なしは以下でできるけど、これは if でやっても変わらないのでは。 text = (counter...

    • プログラマになれません http://anond.hatelabo.jp/20081025202001 今のバイト先の開発チーフには、いつもこの点を注意される。なぜそれでいいのか徹底的に考えろ、ドキュメントをちゃんと読め...

    • いまさらだがFizzBuzz。 1から100まで、3の倍数5の倍数云々って、全部定数の計算じゃね? というところに気付き、自称メタプログラマー(略してメタグラマー)俺の血が騒いだ。 定数計...

      • ん?ん? なんだ・・・? そんなの計算するまでもなく writeln("Fizz"); writeln("Buzz"); とか記述していけばいいだけの話で、改行コードもあわせて出力しちゃえば1行でいけるぜ! みたいな...

        • まあネタなんだけど(笑) マジな要素を抽出するとしたら、 1から100までコードをべた書きするのが実行速度的には効率的なんだけど、 それを手で書くのはバカらしいので、 コンパイル...

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

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