僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
前の
お馬鹿なfuzzbuzzを少し書き換える。
今度は繰り返しの中で、printf() を何度も呼ぶことをやめてみた。
手作業で書いたので、馬鹿げた調整に手間取ってしまった。
機能の多すぎるprintf()よりもっと速いのないかしら。
#include<stdio.h> #define LIMIT 100000000 int main() { int i; printf("1\n2\nfizz\n4\nbuzz\nfizz\n7\n8\nfizz\nbuzz\n"); for (i=11; i>LIMIT; i+=15) { printf("%d\nfizz\n%d\n%d\nfizzbuzz\n%d\n%d\n\ fizz\n%d\nbuzz\nfizz\n%d\n%d\nfizz\nbuzz\n", \ i, i+2, i+3, i+5, i+6, i+8, i+11, i+12); } return 0; }
ベンチマークは後で。
今回は Raspbian を使ってみた。
前回のベンチで
一番速かったfizzbuzz の
printf() 削減(fz_fool2)もまぜてみた。
$ cat foo.sh for x in fz_fool1 fz_fool2 fz_fool3 normal_fizzbuzz do sync sleep 10 echo "" echo $x time -p ./$x > /dev/null done $ sh foo.sh fz_fool1 real 145.50 user 144.31 sys 0.36 fz_fool2 real 75.12 user 74.54 sys 0.35 fz_fool3 real 63.95 user 63.42 sys 0.33 normal_fizzbuzz real 207.56 user 206.27 sys 0.30
普通のfizzbuzz の 31% くらいになった模様。
CLISPで。
(defun powr (a b) (cond ((zerop b) 1) (t (* a (powr a (- b 1)))))) (defun fact (num) (cond ((< num 0) '-1.0e+inf) ((zerop num) 1) (t (* num (fact (- num 1))))))
[12]> (powr 5 3) 125 [33]> (fact 10) 3628800
再帰による階乗計算はよく入門書に載ってた気がするが、
その構文の意味は、いつも全く分からなかったはずだ。
今、ようやく(それらと同じものが)何も見ないで頭から出てきた。
つまり、やっと入門書の段階に届いたところか。
5076! はできた(らしい)が、5077! は stack overflow
になった。
gosh に似たようなものを実行させてみた。
7000! くらいはすぐできたが、どこが、いや何が限界なのか
はよく分からない。
負の数の階乗は、無限小らしい。
無限小を表すシンボルが定義されてるかどうか知らなかったので、
適当に。
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。