僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
断続的ながら
手習い本。
なんとなく分かったような
分からないような。
(defun atom (n) (and (not (null n)) (not (listp n)))) (defun myrec* (old new l) (cond ((null l) '()) ((atom (car l)) (cond ((eq old (car l)) (cons new (myrec* old new (cdr l)))) (t (cons (car l) (myrec* old new (cdr l)))))) (t (cons (myrec* old new (car l)) (myrec* old new (cdr l))))))
(myrec* 'foo 'bar '(fizz (foo) buzz fizzbuzz (fizz foo (fuga fizz foo) foo hoge))) => (fizz (bar) buzz fizzbuzz (fizz bar (fuga fizz bar) bar hoge))
前の再帰は値が大きくなりすぎたようなので、 今度は元データと同じになるだけにする。
$ awk 'function rec(num) { if(num==1) {return 1} else { return 1 + rec(num-1) }} BEGIN {print rec(10)}' 10
$ time awk 'function rec(num) { if(num==1) {return 1} else { return 1 + rec(num-1) }} BEGIN {print rec(2**24)+1}' 16777217 real 0m4.980s user 0m3.580s sys 0m1.400s
2^25(33554432)とかにすると、メモリを非常に多く 食うようだった。スワップが膨れる。
なにげなくawkをgawkでやってみていたが、
思いついて別のmawkで試す。冪乗の
演算子は**でなく^だった。
大体40000くらいまでは行けるようだったが、
$ for x in `seq 100`; do mawk 'function rec(num) { if(num==1) {return 1} else { return 1 + rec(num-1) }} BEGIN {print rec(43650)}'; done | grep -c 43 47
ここでも「セグメント違反だったり通ったり」が。
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。