为了更好地进行测试,我们再增加两个函数,用来更加方便地设置数字和显示数字。
为了暂时避免与我们熟悉的十进制数字相混淆,我们用最原始的符号显示法。
以为目前,一个自然数与其他自然数之间的区别,就在于它的前驱数的不同。
我们这样定义表现规则:
- ①0表示为“□”
- ②0的后继数表现为“■”
- ③其他自然数,在它的前驱数表现形式后面在增加一个“■”
def nShow(a):
if isZero(a):
return '□'
elif nEq(a, nNext(zero())):
return '■'
else:
return nShow(nPre(a))+'■'
如果你自己研究,这个函数会是一个常用的函数。但在自动测试框架中,它的用处没那么大。
此外,我们再增加一个更方便地自然数赋值方法nGetNum()。如果只能用nNext一个一个的取后继,在后面的计算试验中,代码会显得太长。
我们规定nGetNum()是nShow()的逆运算,输入一个显示用的字符串,返回自然数。
我们这样定义获取自然数的规则:
- ①“□”返回“0”
- ②“■”返回“0的后继数”
- ③否则,返回“去掉第一个字符后的字符串所代表的数字”的后继
此外,增加一些扩展,如果输入是空字符串,返回也是0。
def nGetNum(str):
if str=='□' or str=='':
return zero()
elif str=='■':
return nNext(zero())
else:
return nNext(nGetNum(str[1:]))
在我们没有获得十进制的表现法之前,这个函数将是我们唯一的一个快速设置自然数的方法。
我们可以再做一些新的测试:
def test_show():
z = zero()
one = nNext(z)
two = nNext(one)
three = nNext(two)
four = nNext(three)
five = nNext(four)
# 测试isZero函数
assert isZero(z)
assert isZero(nPre(one))
# 测试数字的显示效果
assert nShow(z)=='□'
assert nShow(one)=='■'
assert nShow(four)=='■■■■'
# 测试数字的获取
assert nEq(nGetNum('□'), z)
assert nEq(nGetNum('■■■'), three)
# 测试加法
assert nEq(nAdd(nGetNum('■■■'), five), nGetNum('■■■■■■■■'))