カメヲラボ

主にプログラミングとお勉強全般について書いてます

forかmain再帰か

まず、main関数の再帰が短くなりそうなパターンの、もっとも簡単な例を考えます。
前回(http://d.hatena.ne.jp/Ozy/20061121#p2)でも示したように、単純なループではfor文を使ったほうが短く書けることが確認できました。しかしながら、その差はたった1B。これは、for文を書く際に{}を使ってブロック化することでコードの長さが逆転する場合があるということです。

main(){for(;式;式);}
main(){式&&main(式);}
main(){for(;式;式)式;}
main(){式&&main(式,式);}

式文だけの場合コンマ演算子を用いてブロック化することを避ける事が出来、for文がの特徴を最も生かすパターンに持ち込めますが、mainの再帰を用いた場合、2式以上の動作は処理系依存の上、コードも冗長になります。

main(){for(;式;){文 文 }}

ブロック化が必要な場合、例えばst1がfor文の場合は{}を省略する事が出来ず、場合によってはmain再帰の方が短くなる場合があります。ループ内の処理が必ず『1回以上行われることが保証』されていれば、

main(){文 文 式&&main();}

このような形でコードの長さは等しくなり、さらに2番目の文が式文の場合、

main(){文 式&&main(式);}

のように、1Bだけ短くなりました。これを利用してコード短縮した例が、PKU1011(http://d.hatena.ne.jp/Ozy/20051230#p1)です。main関数に注目すると、

main(){
  型宣言
  for文
  for文
  式&&main(式)
}

という、理想的な形でfor文のブロック化を逃れています。