我们可以通过递归的方式来定义序列,由于是通过tuple来定义的,所以比起正常的序列,感觉很别扭。
练习2.17
定义一系列有关序列的结构
empty_rlist = None
def make_rlist(first, rest):
return (first, rest)
def first(s):
return s[0]
def rest(s):
return s[1]
def len_rlist(s):
length = 0
while s != empty_rlist:
s, length = rest(s), length + 1
return length
def getitem_rlist(s, i):
while i > 0:
s, i = rest(s), i - 1
return first(s)
def last_item(s):
return getitem_rlist(s,len_rlist(s)-1)
def last_pair(s):
while rest(s)!=empty_rlist:
s = rest(s)
return s
counts = make_rlist(1, make_rlist(2, make_rlist(3, make_rlist(4, empty_rlist))))
补充练习
:定义两个序列的append操作
递归的一层一层的解开,然后又组合在一起
def append(s1,s2):
if s1==empty_rlist:
return s2
return make_rlist(first(s1),append(rest(s1),s2))
练习2−19:
定义过程reverse
def reverse(s):
r=empty_rlist
while s!=empty_rlist:
s,r = rest(s),make_rlist(first(s),r)
return r
练习20
利用可变参数创建序列,其中只选取与第一个元素奇偶一致的整数。
def same_partity(first,*remains):
def do_same_partity(first_item,*rest_items):
if rest_items==():return empty_rlist
if (first_item^first)&1 != 1:
return make_rlist(first_item,do_same_partity(*rest_items))
return do_same_partity(*rest_items)
return do_same_partity(first,*remains)