【educoder】离散数学:自然数系统

【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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值