【educoder】离散数学:自然数系统
第1关:NaturalNumber的输出
任务描述
请编程实现__str__(self)函数,该函数在NaturalNumber对象被print时被调用。几个输出示例如下所示,请根据输出示例完成函数:
zero = NaturalNumber(None)
print(zero)
one = NaturalNumber(zero)
print(one)
two = NaturalNumber(one)
print(two)
运行结果为:
Zero
Succ Zero
Succ(Succ Zero)
相关知识
请参见教材。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试,输入输出示例参见“任务描述”。
class NaturalNumber(object):
def __init__(self, pre):
self.pre = pre
def __str__(self):
#该方法在NaturalNumber对象被print时被调用
#********** Begin **********#
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
#********** End **********#
第2关:NaturalNumber的加法
任务描述
请编程实现__add__(self, other)函数,该函数重载了加法(+)运算,请根据教材定义的自然数加法运算规则实现该函数,即:a+Zero = a;a+succ(b)=succ(a+b)。
几个输出示例如下所示,请根据输出示例完成函数:
print(one + zero)
print(zero + one)
print(one + one)
print(one + two)
print(zero + zero)
输出为:
Succ Zero
Succ Zero
Succ(Succ Zero)
Succ(Succ(Succ Zero))
Zero
相关知识
请参见教材。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试,输入输出示例参见“任务描述”。
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)
#********** Begin **********#
return self if other.pre is None else NaturalNumber(self + other.pre)
#********** End **********#
第3关:NaturalNumber的乘法
任务描述
请编程实现__mul__(self, other)函数,该函数重载了乘法(∗)运算,请根据教材定义的自然数加法运算规则实现该函数,即:aZero = Zero;asucc(b)=a*b+a。
几个输出示例如下所示,请根据输出示例完成函数:
print(zero * zero)
print(zero * one)
print(one * zero)
print(one * two * zero)
print(two * two)
print(two * NaturalNumber(two))
print(two * two * two)
输出为:
Zero
Zero
Zero
Zero
Succ(Succ(Succ(Succ Zero)))
Succ(Succ(Succ(Succ(Succ(Succ Zero)))))
Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ Zero)))))))
相关知识
请参见教材。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试,输入输出示例参见“任务描述”。
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):
#********** Begin **********#
return NaturalNumber(None) if other.pre is None else self * other.pre + self
#********** End **********#
第4关:将NaturalNumber转换为阿拉伯数字形式
任务描述
请编程实现toNumber(self)函数,该函数将NaturalNumber对象转换为阿拉伯数字的形式。几个输出示例如下所示,请根据输出示例完成函数:
print(zero.toNumber())
print(one.toNumber())
print(two.toNumber())
print((two*two*two).toNumber())
输出为:
0
1
2
8
相关知识
请参见教材。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试,输入输出示例参见“任务描述”。
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):
#********** Begin **********#
return 0 if self.pre is None else self.pre.toNumber() + 1
#********** End **********#
第5关:后继函数
任务描述
请编程实现succ(n)函数,该函数创建代表给定NaturalNumber对象n的后继NaturalNumber对象,并返回新建对象。
几个输出示例如下所示,请根据输出示例完成函数:
print(succ(zero))
print(succ(one))
输出为:
Succ Zero
Succ(Succ Zero)
相关知识
请参见教材。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试,输入输出示例参见“任务描述”。
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对象
#请在此实现该函数
#********** Begin **********#
return NaturalNumber(n)
#********** End **********#
第6关:foldn构建自然数
任务描述
自然数的表示还可用函数,如用下面的简单记法表示自然数n:n=foldn(zero,succ,n)。
我们称foldn为自然数上的叠加(fold)操。foldn(zero,succ,n)表示从零开始,不断叠加使用succ函数n次。
foldn函数可以具体实现如下:
foldn(z,f,0) = z
foldn(z, f, n+) = f(foldn(z, f, n))
foldn定义了在自然数上的一种操作,只要令z为zero,令f为succ就可以实现叠加后继若干次,从而获得某个特定的自然数。例如:
foldn(zero, succ, 0) = zero
foldn(zero, succ, 1) = succ(foldn(zero, succ, 0)) = succ zero
foldn(zero, succ, 2) = succ(foldn(zero, succ, 1)) = succ(succ zero)
请根据上述定义,实现foldn函数。几个输出示例如下所示,请根据输出示例完成函数:
five = foldn(zero, succ, 5)
six = foldn(zero, succ, 6)
print(five)
print(six)
print(five.toNumber(), six.toNumber())
print(six * five)
输出为:
Succ(Succ(Succ(Succ(Succ Zero))))
Succ(Succ(Succ(Succ(Succ(Succ Zero)))))
5 6
Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ Zero)))))))))))))))))))))))))))))
相关知识
请参见“任务描述”。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试,输入输出示例参见“任务描述”。
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):
#********** Begin **********#
#请在此处实现foldn的功能
return init if n == 0 else NaturalNumber(init) if n == 1 else foldn(NaturalNumber(init), h, n-1)
#********** End **********#
第7关:另一种foldn表示自然数
任务描述
在上一关基础上更进一步,我们可以将foldn(init,h,n)定义为f(n)=foldn2(init,h)(n)。如果init不是zero,h不是succ,则可用foldn2(init,h)来描述一些更有意思的事物。
例如:
(+m)=foldn2(m,succ)
描述了将自然数n增加m的操作,将它依次作用到自然数上可以产生和自然数同构的序列m,m+1,m+2,…,n+m,…
(-m)=foldn2(0,(+m))
描述了将自然数n乘以m的操作,将它依次作用到自然数上可以产生和自然数同构的序列0,m,2m,3m,…,nm,…
m^()=foldn(1,(-m))
描述了对自然数m取n次幂的操作,将它依次作用到自然数上可以产生和自然数同构 的序列1,m,m²,m³,…,m^n,…
请根据上述描述编程实现foldn2(init, h)。几个输出示例如下所示,请根据输出示例完成函数:
print(foldn2(five, succ)(five))
print(foldn2(zero, foldn2(five, succ))(three))
print(foldn2(one, foldn2(zero, foldn2(five, succ)))(two))
输出为:
Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ Zero)))))))))
Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ Zero))))))))))))))
Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ(Succ Zero))))))))))))))))))))))))
上述程序片段中的five、three、two分别为代表自然数5、3、2的NaturalNumber对象。
相关知识
请参见“任务描述”
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试,输入输出示例参见“任务描述”。
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的功能
return init if n.pre is None else h(f(n.pre))
#请在此区域内实现foldn2的功能
#********** End **********#
return f