SICP-2.1 solution

(define (make-rat n d)
  (define (gcd a b)
    (if (= b 0)
        a
        (gcd b (remainder a b))))
  (let ((g (gcd (abs n) (abs d)))
        (modifier (if (positive? d) 1 -1)))
    (cons (* modifier (/ n g)) (abs (/ d g)))))

注意原gcd没考虑正负数问题所以需要abs。如果用drscheme自带的gcd就不用了,它总是返回正数。

老潘的Eurotrip IV - 布鲁日

偷懒用写给朋友的email,呵呵。

19号和20号两天的布鲁日之行,实在是一言难尽。。。我把相机的电全部拍光了,到后来觉得根本没法拍,因为到处是名胜,到处有典故,到处看风景。城很小,我感觉可能也就一个东城区大?在街上我经常碰到之前遇到过的人,包括住同一个青年旅店的人,头一天一起参观过某个景点的人等等。但是实在太震撼了,不得不佩服人家对于文明的保护意识和执行力度。

青年票从布鲁塞尔出发到布鲁日,往返票只要7欧元。我是周六早上10点左右到达的,下车买了份地图(制作真精良!),非常明智的第一站直奔旅馆。因为我之前没预定,只知道Brugge这家hostel是最好的(www.snuffel.be)。结果巨走运,人家只剩最后一个床位了。我问又不是旅游旺季怎么这么多人,他们说可能是周末吧。答案我在晚上知道了,呵呵,一会儿说。

拿到一张市内景点的打折卡,当地人撰写的导游图,把一些没用的东西锁进柜子,然后就轻装四处转。第一天没什么规划,不过下午想赶去参观一个著名的家庭酿酒作坊,因为一天只有两场,时间限制比较紧。布鲁日是世界文化遗产,因为它非常完好的保留了中世纪风貌。大街上随处可见某个房子贴着类似"我是遗产"的标志,而且在墙正面醒目的地方写上16XX的年代字样。另外一个雅号叫北方威尼斯,因为临海,城内河流纵横交错,很有感觉。不过我觉得它的水肯定没有威尼斯多。水上经常看见野鸭,海鸥,和一些不知名的海鸟。最漂亮的莫过于白天鹅了。

中午吃饭,品尝了著名的煎饼pancake。吃了俩,一个鸡肉咖喱,一个冰激凌香蕉,都是suggestion。馆子是n老的一个。反正布鲁日都这德行,好多地儿都是一大妈说我们这店开了xx年了,然后摆出一副倚老卖老的嘴脸。接下来去中心广场转了转,就去啤酒作坊了。广场没有布鲁塞尔的恢宏,不过钟楼实在有自己的特色,也是当地第一名胜。

到了啤酒作坊,n多人。女导游是个长得很敦实的比利时妇女,说英语,巨能侃而且爱讲笑话,表情和肢体语言都特丰富,有北京大妈风范。她说我们是唯一一个在一幢房子里完成啤酒酿造全过程的作坊了,然后说了好多作坊的历史,啤酒的历史,品牌的历史等等。比利时啤酒真不是盖的,现存的就有700多种,加上巧克力,你可以想象这里人多会享受多慵懒了。

从酿酒作坊参观完,和几个荷兰人聊了几句,一起喝了参观附带的啤酒。天开始擦黑了。冬天欧洲就是不好,早上9点天都是暗的,晚上5点就黑了,真的。路过一超市,进去转转,发现有半成品鸡腿,腌好的,2个多欧元,看起来不错,心动了,因为青年旅社有厨房可以自己做饭。我买了这个还买了2欧元的菜,一大袋子菜,洗好切好的,而且上面写着Chinese vegetable...还买了一升梨汁,打算自己做顿饭吃。中午吃pancake吃了15欧啊,呵呵,晚上想省一下。

到了旅社,电磁炉,起平底煎锅,锅热了把鸡放进去。我本来以为它自己带油,结果发现不带,赶紧关小火加玉米油(厨房自带的)。加热了一下香味就出来了,我觉得差不多了的时候就把菜也放进去,这时候有别的人路过厨房就开始说真香真香,哈哈,弄得我感觉跟个大厨是的。做出来两大盘子,最后我都没吃完,还剩一口菜。不过味道还真不错,最重要的是吃了好多各种各样的蔬菜!很健康!我还放了一些厨房提供的意大利面酱在旁边,蘸蔬菜吃。

晚上刚开始有点寂寞啦,在旅社酒吧里面坐着,一个人也不认识,睡觉时间还早,于是要了杯黑啤慢慢品,规划了一下第二天行程,快十点了准备上去睡。发现同屋只有一个人,是个在柏林上学的俄罗斯人。刚聊没几句,进来俩比利时姑娘说她们有个同伴喝太多吐了,能不能让她呆在我们屋,因为她们其他人夜里都要出去party,而这间屋她们也有床位。我心说你们真自私,不过我是无所谓啦。不过后来也不知怎么一折腾又不用这样了。我出屋准备拿点东西就睡觉,结果门口有个比利时姑娘跟我打招呼说hi Chinese,我也打招呼,结果发现她跟刚才那俩是一伙儿的。他们一行一共21个人,有男有女,同班同学,从安特卫普过来玩,因为是高中最后一年了,都想high一把。我说怎么青年旅店床位都被定光了呢!然后就站在房间门口开聊,不一会儿他们过来十来个人围着跟我聊,大概看中国人都觉得新鲜吧,呵呵。我一天没说话了也憋得慌,说呗,结果发现我英语说得比他们还快。他们特惊异,说我的英语说得像母语一样,呵呵,夸张了。不过我不是我吹牛,我真的比他们说得好。越聊越高兴,他们还拿出"正宗的比利时啤酒"来非让我喝,还喊口号,可有意思了。一边吹自己的啤酒,一边说荷兰的啤酒sucks。反正什么都臭贫。他们真是对中国一无所知,所以说点东西给他们就觉得很稀奇。后来他们干脆邀我一块去party。出门已经夜里一点多了,俄罗斯人也加入了。在一个夜店门口还遇到了美国人和澳大利亚人,多国部队散兵游勇似的在布鲁日的夜里瞎折腾。美国人巨贫,德克萨斯的,说的我们都不行了。我第二天还在另外一地儿又见着这美国人了。不过后来2点多我跟俄罗斯人就回来了,因为不喜欢那种bar。这帮比利时孩子都挺好的,17,8岁,挺热情的,单纯,在我眼里就像孩子一样(反过来他们说我good gooking而且很cool,哈)。我觉得欧洲人普遍表现出来比较冷淡,要是成年人就不会跟我这么聊。

这是我第一次跟当地人亲密接触吧。还是孩子好啊。

说句题外话,这里公共厕所特少,而且收费,一般是30分或40分。夜里我可怜的俄罗斯同伴在畅饮比利时著名的Juplier啤酒后,在大街上无奈的wild pee了两次。巨搞笑的是我还见到有人躲在墙角里朝着巨大的中世纪church进行wild pee,不知道耶稣他老人家是什么心情。布鲁日有规定,wild pee罚款100欧元,估计就是针对wild pee-er太多而设立的吧,要不然干嘛非搞这么个搞笑规定,还罚那么多。

总之第一天就这么过去了。夜里睡得不算好,酒店住惯了,青年旅馆条件确实不行,不过15欧一晚,带淋浴带厨房管早饭,你还奢求什么呢。第二天9点起来,俄罗斯人和比利时孩子们还睡着呢,我就退房出游了。好在网络发达以后很容易联系。

第二天就是按照既定计划,还是很成功的,该看的都看了。钟楼上去了,3百多个台阶,高到不高,关键是螺旋的而且很窄。途中遇到美国人日本人英国人韩国人,哈哈。我照旧跟日本人胡乱说日语,不过这三个日本人给人感觉还行,不是唧唧缩缩,点头哈腰那种。然后就是参观博物馆啥的了。有个米开朗琪罗的雕像,很不错。还吃了当地一个很有名的lasagna。

这地方到处是漂亮而宏伟的教堂,满街都是博物馆。尤其是走在特普通的一大街上,一特不起眼儿的小屋就是一博物馆。没有现代建筑物,完全是中世纪风貌,真是难以想像。

老潘的Eurotrip III - 留学法国的女博士

到这边一星期了。觉得这一礼拜过得巨慢。我想对于人类来说,即使都活同样的时间,感觉到的时间长度也是不同的吧。所以说感官真是个奇怪的东西。

布鲁塞尔号称欧洲的国际交通枢纽。在这边我遇到了各种各样的人,比利时人,印度人,英国人,阿拉伯人,日本人,蒙古人,当然还有中国人。遇到日本人可有意思了,第一眼分辨不出来,但其实仔细观察他们的行为,还是跟中国人不一样。他们一般在迷失方向的时候,神情专注而迷茫,凑着地图起劲儿而认真小心的研究。通常我都会上去跟他们逗两句日语就撒哟娜拉了,有意思。中国人嘛,昨天我在欧洲议会附近转悠的时候遇到一个广东姐姐,在法国里昂读书的女博士,很投缘。后来在她的帮助下还在正宗比利时菜馆(http://www.tavernedupassage.com/,一点都不贵哦)吃到了“没有比这个更比利时的比利时菜”。真是非常庆幸在国外遇到合得来的同胞,而且是法语非常地道的同胞!不过我们一起转悠的时候遇到了两个明显带有农民企业家形象的中国人。。。让人大跌眼镜。。。就是敞胸露怀,两手插在裤兜里,一副土了吧唧的暴发户形象。。。

本地人呢,有和善的也有排外的,有开朗的也有害羞的。作为外来客,只要你自己心胸宽广就没问题啦。

看景色有点审美疲劳了:随便一个街景都很漂亮并带有欧洲中世纪风味儿。整个城市里星罗棋布的教堂及各色古建筑更是宏伟,看多了都麻木了。就像本地人说的,到布鲁塞尔的Grand Place不要照相了,照不过来。

啊,关于美食,嗯嗯,刚才提到的正宗比利时菜肴,其实就是很嫩的鸡肉和起酥面包,淋上融化了的特制奶酪,佐以炸薯条。他们的白啤酒可真是不赖!!!一定要记住这个牌子:Hoegaarden。叫白啤酒,其实那种啤酒是浑浊不透明的,颜色大概比柠檬黄更白一点。我还吃了巴黎著名的面包房PAUL的点心。那个巧克力蛋糕真是难以形容:巧克力味儿极浓,却不腻,也不像大众食品那样甜得难受。派也不错,起酥做得巨好吃,不过我觉得上面淋的东西太甜了。啊啊,我已经不行了,我想把PAUL所有的点心都吃一遍!!!但我一定要再吃巧克力的那个!!!

至于巧克力嘛,我在这边估计已经吃了十几种口味了。。。我不喜欢吃齁儿甜的,其实Leonidas那种70欧分的巧克力,买dark口味的,略苦,不太甜,我已经觉得味道挺好了。买了一盒各种口味的,倒是没有这个纯。

老潘的Eurotrip II - 百元炒饭

今天有点儿受不了面包了,晚上下班后出去撮了一顿米饭。啊,我果然还是爱吃米啊!!!md一份鸡肉炒饭合人民币85块钱,回去我不吃别的了,光吃炒饭,哈!人民爱人民币!!!人民币为人民!!!我就是人民!!!

说归说,估计我还会去吃80多块钱的炒饭的。。。80多块钱,在北京能吃多少炒饭啊!!!我上高中时楼下牛肉炒饭才6块钱,那么大一盘子!!!当然现在是没了。。。

过得挺爽的,其实想吃什么选择挺多(别跟北京比!!!),我就是有点没时间转。比如今天中午就顾跟客户说问题了,午饭都没吃。那天还吃了一类似土耳其烤肉的东西,5欧元,味道还过得去,分量不小。卖东西的那俩小二巨神叨,一路库尼齐瓦、你好的招呼我,我都不行了。

出来前我就跟爸妈说好了,回去不用弄别的,私房水煮鱼一盆,豆芽菜做底,私房水煮肉一盆,大白菜做底,上好白米饭一锅,就齐了。很久不吃一定更想念,所以在此之前我要把西餐吃个够,哈!

别光顾说吃了。跟这边我生活习惯巨好,10点睡6点起。起来是北京时间下午一点,好跟朋友skype。白天虽然国际长途随便打,但上班时间还是太忙,而且本着敬业的态度也不能老聊天啊。我随着客户这边,基本不怎么加班。北京team就比较辛苦了,跟我在的时候一样,老加班。所以从某种意义上来说,我终于能喘口气了。就像现在这样,下了班街上转转,找点儿好吃的,回来看点儿动画片儿,沏点儿普洱或者大红袍(谢谢驴!!!)。住酒店,自己不用收拾屋子,洗澡巨方便,困了倒头就睡。

布鲁塞尔这小城市,冬天正值雨季,太阳即使露面,也不是大方光芒送温暖那种。好在雨都下不大,下下停停。刮风,有点冷。这点有点儿像北京。不过我巨抗冻,就跟我之前猜得一样,带的厚衣服根本用不上。而且我能吃能睡,也没水土不服。空气好,我只用清水洗脸就很舒服。不像北京,长跑完吐的痰都是黑的。

老潘的Eurotrip I - 初到布鲁塞尔

嘿,早上5点多就醒了,算起来睡了13个小时吧。舒服~饿了,直接啃昨儿买的三明治(本来想当晚饭吃,结果下午4点就睡了),想起7点就有早餐,决定只吃一半。

这边三明治真便宜啊,12寸的,2欧元多一点,比国内的Subway还便宜。虽然没办法顿顿都吃这个,但一看巨大的这玩意儿我就觉得肯定饿不死了。。。

然后去吃了自助早餐。我觉得我没吃多少啊,怎么就饱了。。。呵呵,反正就西餐那些东西,没啥新鲜的。有espresso喝,不错,虽然味道不地道,不过我不挑。

然后穿上跑鞋去jogging。今天天气真好啊,有太阳。一直往北跑。主要是为了找Proximus,为明天上班做好准备。跑出去两分钟,找到了。。。真令人泄气。。。一点冒险精神都没有。

接着往北跑。。。跑出挺远,发现一教堂,哎,纯白的还挺好看。跑到跟前发现隔着一铁路。仔细观察发现有地底通道。。。嗯嗯,真有感觉,好像在玩魔法门六。

这时就听见教堂钟声响啦。要是这时候天上飞来一只龙什么的就好玩了,教堂里可以出来一堆牧师,法师之类的东西,口中念念有词,然后各色光球像放花一样朝天上招呼。好吧我先不幻想了。。。总之我跑到教堂跟前了。嗯,是挺好看的。看不少人往里走,想想今天刚好是周日,应该有礼拜之类的。我就上前,也假模假式的进去了。有一人站门口一脸热情和虔诚的发书,我就朝他笑笑接过来。好吧,被你们猜中了,我一个字儿都看不懂,全是荷兰语。不过能看出是歌谱,而且全是关于Jesus他老人家。总之我就坐着听了一会儿管风琴,看见神父大人跟一些熟识的人互相致以亲切问候,然后我就出去了。。。我当然没忘把书放回去。那书是循环利用的。

我出了教堂看见一小花园儿,进去一看是个公墓。嘿,这地方可真不错,人家一个人占那么大一块儿地儿,巨干净,还有各种雕塑和建筑物,置身其中感觉在玩Diablo。。。想起上次去给我爷爷扫墓,真是。。。差距太大了

我转了一圈儿,没什么人,也没有僵尸爬出来什么的。看见一只黑猫一闪而过,我追过去,发现它给我指了路:我现在站在一个刚才就想去的挺大的建筑物跟前。也不知道是干什么的,貌似是某个国王之类的陵墓吧。。。

哦,我好像应该从头说。。。没想到头一次出国,头一次出差,就被发到欧洲来了,而且只有我一个人。反正之前历尽各种困难和不靠谱的事,比如手机被入室盗窃的贼偷了(这事儿比较有意思,我得单写一篇),还有客户那边的笨蛋没接到使馆官员的电话导致我被拒签等等,最后没想到我还是过来了。号称欧洲首都的布鲁塞尔,当地时间1月5号到的,也就是昨天。所有那些乱七八糟的事都是我自己办的。英语真有用,嗯嗯。

都怪之前我把欧罗巴人民想得太优秀了。。。他们一样随地扔垃圾和烟头,一样随地吐痰和口香糖,行人一样闯红灯。。。只是也许情况比中国好些。也许我该去德国看看,因为据说德国人更守规矩。我只是感觉,如果给他们13亿人,他们的大街也会一样脏乱差。。。

另外这边冬季是雨季,天巨阴而且天天下雨,昨天我的伞根本没法收起来。地面永远是湿的。还好今天出太阳了。我得去转转,转转。。。

SICP-1.46 solution

(define (iterative-improve good-enough? improve)
(define (iter guess)
(if (good-enough? guess)
guess
(iter (improve guess))))
iter)

(define (sqrt x)
(define (good-enough? guess)
(< (abs (- (sqr guess) x)) 0.001))
(define (improve guess)
(define (average x y) (/ (+ x y) 2))
(average guess (/ x guess)))
(define (sqrt-iter guess)
(if (good-enough? guess)
guess
(sqrt-iter (improve guess))))
(sqrt-iter 1.0))

(define (fixed-point f first-guess)
(define (close-enough? v1 v2)
(define tolerance 0.001)
(< (abs (- v1 v2)) tolerance))
(define (try guess)
(let ((next (f guess)))
(if (close-enough? guess next)
next
(try next))))
(try first-guess))

(sqrt 2)

(fixed-point sin 1)

(define (sqrt x)
(define (good-enough? guess)
(< (abs (- (sqr guess) x)) 0.001))
(define (improve guess)
(define (average x y) (/ (+ x y) 2))
(average guess (/ x guess)))
((iterative-improve good-enough? improve) 1.0))

(define (fixed-point f first-guess)
(define (close-enough? v1)
(define tolerance 0.001)
(< (abs (- v1 (f v1))) tolerance))
(define (improve guess) (f guess))
((iterative-improve close-enough? improve) first-guess))

(sqrt 2)

(fixed-point sin 1.0)

啊,老潘终于在新年伊始把第一章干掉了。。。好久没看SICP了,俩月了吧,真忙啊。不过再翻第一章有不同的感觉了,呵呵。最近Python写得越来越functional了。。。可能有关系吧。

SICP-1.45 solution

(define (repeated-i f n)
  (define (iter accum k)
    (if (= k 1)
        accum
        (iter (lambda (x) (f (accum x))) (- k 1))))
  (iter f n))

(define (fixed-point f first-guess)
  (define tolerance 0.001)
  (define (close-enough? v1 v2)
    (< (abs (- v1 v2)) tolerance))
  (define (try guess)
    ;(display guess)
    ;(newline)
    (let ((next (f guess)))
      (if (close-enough? guess next)
          next
          (try next))))
  (try first-guess))

(define (average-damp f)
  (define (average x y) (/ (+ x y) 2))
  (lambda (x) (average x (f x))))

(define (square-root x)
  (fixed-point (average-damp (lambda (y) (/ x y))) 1.0))

(define (cube-root x)
  (fixed-point (average-damp (lambda (y) (/ x (* y y)))) 1.0))

(define (fourth-root x)
  (fixed-point ((repeated-i average-damp 2) (lambda (y) (/ x (* y y y)))) 1.0))

(define (fifth-root x)
  (fixed-point ((repeated-i average-damp 2) (lambda (y) (/ x (* y y y y)))) 1.0))

(define (sixth-root x)
  (fixed-point ((repeated-i average-damp 2) (lambda (y) (/ x (* y y y y y)))) 1.0))

哎,看出来了么: 

(define (test-nth-root n times-to-damp)
  (lambda (x)
    (fixed-point ((repeated-i average-damp times-to-damp)
                  (lambda (y) (/ x (expt y (- n 1)))))
                 1.0)))

试了多次以后找到规律:

n             damp次数        关系

1-3          1

4-8          2                   8 = 2 ^ (2 + 1)

9-16        3                   16 = 2 ^ (3 + 1)

17-32      4                   32 = 2 ^ (4 + 1)

于是,求x的n次方:

(define (nth-root n x)
  (define (calc-damp n) (- (ceiling (/ (log n) (log 2))) 1))
  ((test-nth-root n (calc-damp n)) x))

注意其中的calc-damp,比如9-16的log2(n) ,结果肯定落在(3,4],因此ceiling上去统一用16的,准没错儿。

分页共1页 1