トップ «前の日記(2016-04-25(Mon)) 最新 次の日記(2016-04-27(Wed))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2016-04-26(Tue) 昨日と似た感じ

括弧の中まで置換

断続的ながら 手習い本
なんとなく分かったような 分からないような。

(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の段数

前の再帰は値が大きくなりすぎたようなので、 今度は元データと同じになるだけにする。

$ 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や内容が変った場合はあしからず。

index.htmlは ここから。