我正在尝试仅使用以下操作来构建减法、加法、除法、乘法和其他运算:
- incr(x) - 一旦调用此函数,它将把 x + 1 赋给 x
- allocate(x, y) - 该函数将把 y 的值赋给 x (x = y)
- Zero(x) - 该函数将 0 分配给 x (x = 0)
- Loop X { } - 括号内写入的操作将被执行 X 次
使用以下规则可以直接实现加法(add),如下所示:
ADD (x, y) {
loop X {
y = incr (y)
}
return y
}
然而,我正在努力实施减法。我认为所有其他需要的操作都可以使用减法来完成。
任何提示将不胜感激。
史蒂芬·科尔·克莱恩设计了一种使用整数加法执行整数减法的方法。但是,它假设您不能有负整数。例如:
0 - 1 = 0
1 - 1 = 0
2 - 1 = 1
3 - 1 = 2
4 - 1 = 3
5 - 2 = 3
6 - 3 = 3
6 - 4 = 2
6 - 5 = 1
6 - 6 = 0
6 - 7 = 0
在您的问题中,您使用增量运算实现了加法运算。
类似地,您可以使用自减运算来实现减法运算,如下所示:
sub(x, y) {
loop y
{ x = decr(x) }
return x
}
现在,我们需要做的就是实现减量操作。
这就是克莱恩的天才之处:
decr(x) {
y = 0
z = 0
loop x {
y = z
z = incr(z)
}
return y
}
这里我们使用了所有四种操作。它是这样工作的:
-
我们有两个基本情况,y
(基本情况为0
) and z
(基本情况为1
):
y = 0 - 1 = 0
z = 1 - 1 = 0
因此,我们将它们都初始化为0
.
When x
is 0
我们运行循环0
次(即从不),然后我们只需返回y = 0
.
When x
is 1
然后我们运行一次循环,分配y = z
然后简单地返回y = z = 0
.
请注意,每次我们运行循环时y
保存当前迭代的结果,同时z
保存下一次迭代的结果。这就是我们需要两个基本情况的原因。递减函数不是连续函数。它是一个分段的功能:
decr(0) = 0
decr(n + 1) = n
当克莱恩去看牙医时,牙医拔掉了他的两颗牙齿,他意识到了这一点。他在试图解决这个问题时感到沮丧,当牙医拔掉他的两颗牙齿时,他意识到他需要两个基本情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)