递归的重要应用。包含了7关的答案,其中递归思想得到了重要的应用,其使得代码简化了很多。
class NaturalNumber(object):
def __init__(self, pre):
self.pre = pre
def __str__(self):
#该方法在NaturalNumber对象被print时被调用
#请在下面编程
result = ''
if self.pre == None:
result = "Zero"
elif self.pre.pre == None:
result = "Succ Zero"
else:
pre = self.pre
result = "Succ(" + pre.__str__() + ")"
return result
def __add__(self, other):
#该方法重载了+运算,请编程实现自然数系统的加法:
# a + zero = a
# a + succ(b) = succ(a + b)
if other.pre == None:
return self
else:
return NaturalNumber(self + other.pre)
def __mul__(self, other):
# 该方法重载了+运算,请编程实现自然数系统的加法:
# a * zero = zero
# a * succ(b) = a * b + a
if other.pre == None:
return NaturalNumber(None)
else:
return self * other.pre + self
def toNumber(self):
#该方法实现NatrualNumber到其对应的阿拉伯数字的转换
#如zero->0, one->1,...
if self.pre == None:
return 0
else:
return self.pre.toNumber() + 1
def succ(n):
#返回一个以NaturalNumber对象n为前继的NaturalNumber对象
#请在此实现该函数
return NaturalNumber(n)
def foldn(init, h, n):
#请在此处实现foldn的功能
if n == 0:
return init
else:
return h(foldn(init, h, n-1))
def foldn2(init, h):
def f(n):
#********** Begin **********#
#请在此区域内实现foldn2的功能
if n.pre==None:
return init
#实际上,n等于0的时候就不必要进行加的操作,直接返回init就行
#此时的init就是Succ的格式
else :
return h(foldn2(init,h)(n.pre))
#这个地方就比较难理解了,n.pre就相当于n-1,就是我们让操作数减去1
#这样操作直到n变成0,返回值就会变成 h(h(h(...))) 就有一堆的h函数叠加起来
#h实际上输入的是一个函数,至于它是succ 还是foldn2,这都由系统决定,我们不用进行分类讨论
#请在此区域内实现foldn2的功能
#********** End **********#
return f