@shellex说: 对对,他们上辈子都是折翼的新奥尔良鸡翅

Pages

Topics

随便看看

路边社评论员

  • Keith:
    还能用不. »
  • deepblue:
    测试一下浏览器和系统 »
  • abettor:
    “就和CPU特权级别一样”——这的哥难道是Linus的表弟?! »
  • 董英男:
    为什么总提示确认是相册首页呢 到底哪个才是相册首页啊 »
  • kendisk:
    作为一个轻度Linuxer,刚分手后,感觉木有鸭梨。 »
  • MS IE:
    THIS SITE REALLY SUCK! »
  • Alex:
    gnome-women... »
  • liangsuilong:
    GNOME 自己也有鼓励女性参与项目的计划啊.. »
  • infinte:
    对不起,你的“解ban”版本算得有点问题,可以下(9)pp4 测试。ACID3可有95分啊……另外同... »
  • Alex:
    »
  • Randee Saadat:
    Glad you solved your problem, but what is your que... »
  • LinuxRock:
    没想到你也有一台和我一样的破机子......还好现在高三没怎么用,受不了它的发热量.. »

Posts Tagged ‘SICP’

对付冗余计算…的那个途径

问题来自SICP.
该Sample描述了一个换硬币的问题,卡卡,就是偶们是小朋友的是哈哈,父亲大人/母亲大人可能给你一张大..大的钞票,出去打酱油..:D,花不完的,老板会找你钱。找多少钱是个思想斗争,于是就有了这个问题。
给予一定的硬币种类kinds-of-coins和一定的金额amount,使用这些硬币有多少种方式能组成这个金额呢?
很简单哈,所以就书上直接就是源码鸟(这里)。
可惜哈,这个代码实现的是一个树状递归,而树状递归的效率是非常的龌龊,不信你可以试试画一下amount=11, kinds-of-coins=5时的递归计算过程,这个树的很多枝枝丫丫都是一样de,骗取社会主义劳动成功,死人领着活人工资。
所以在脚注34里就提到一种对付这些枝枝丫丫的政策,所谓“记忆技术”(memoization)就是了。
脚注里面说得很呆,其实很简单,把已经算得的结果缓存起来,然后遇到同样的计算任务的时候拿出来用就好。练习3.27就是这么搞的,可惜scheme里面木有构造Cache的现成数据结构,要我实现dic,hash table,什么的我那么lazy的所以不愿意的。不过我的实现也不大优雅,memorize和被memorize的函数杂糅到一起了,python高手告诉我,有木有办法分开?
import time

def change_coins(money):
first_denomination = {
1:1, 2:5,
3:10, 4:25,
5:50,
}
def cc((amount, kinds_of_coins)):
if amount == 0:
return 1
elif amount < 0 or kinds_of_coins == 0:
return 0
else:
return cc((amount, kinds_of_coins – 1)) \
+ cc((amount – first_denomination[kinds_of_coins], kinds_of_coins))

return cc((money, 5))

def change_coins_memoization(money):
first_denomination = {
1:1, 2:5,
3:10, 4:25,
5:50,
}
cache = {}
cc_memo = lambda x :memoize(cc) (x)
def memoize(fun):
def proc(k):
if cache.has_key(k):
return cache[k]
else:
x = fun(k)
cache[k] = [...]

Church计数和Lambda演算

在SICP的练习2.6 提到了Church计数,也就是将数据和操作引入Lambda演算,告诉我们,一旦拥有Lambda,别无所求。这些搞数学的家伙总是喜欢把可以不要的东西全全都去掉,然后用2.6这样的习题中表现出来的能力彻底雷到我。所以像我一样数学只有半桶水的同学先看看维基总是比较好:( http://en.wikipedia.org/wiki/Lambda_calculus )
Wiki:
lambda演算,也称为λ-演算,作为一个形式定义系统去研究函数定义、实现、递归。也是Lisp这类语言计算模型。
定义
一个Lambda 表达式应该由以下的东东构成
变量: v1, v2, . . .
符号:λ 和 .
括号组:( 和 )
一个合法的Lambda 表达式<expression>可以按照如下递归定义:

<expression>  = <variable> | <function> | <application>
<function>  = λ <variable>.<expression>
<application> = (<expression> <expression>)

Lambda表达式记号法
对于Lambda表达式M和N,

最外层括号可以省略:  (M N) 可以表示成 M N.
(λx. M)这样的表达式 被称为函数抽象,原因是它常常就是一个函数的定义,函数的参数就是变量x,函数体就是M,而函数名称则是匿名的。你可以认为它就是f(x)=M,匿名就意味这函数名’f’是不存在的,存在的仅仅是x映射到M这个过程。
函数应用采用左结合: M N P 表示 (M N) P.
Lambda表达式在记法上使用贪婪扩展: 也就是说 λ x. M N 表示 (λ x.M N) ,而不是(λ x. [...]

快速进行素数测试

SICP虽然已经拿到手很长时间了,一直是懒洋洋地看,快看到完第3章了,就是没做题。昨天遇到了有关判定素数的问题,似乎见过的,决定把前面的习题做了….我错了,:( 然后我决定以后的习题每题都要做。
好吧。在1,3节的时候有提到判断素数的方法。朴素的素数判定,地球的同学都知道的,如果数n除1以外的最小因数是他自己,那么n就是素数。

;return the smallest divisor of n
(define (smallest-divisor n)
;find a divisor(for 2 to n) of n
(define (find-divisor n test-divisor)
(cond ((< n (sqrt test-divisor)) n)
((= (remainder n test-divisor) 0) test-divisor)
[...]

Page 1 of 11