趣题:只用赋值、自增和循环操作实现减法运算

  网友Mingliang Zhu在TopLanguage上发起提问。

  设想这样一个计算机系统,它只支持以下几个操作:
    1. 定义变量、给变量赋值;
    2. 变量自身加一;
    3. 令一段语句循环执行指定的次数。
  这个系统只处理且只能处理0和正整数。系统不存在“溢出”的问题。
  注意这个系统没有比较运算,事实上它甚至不存在Boolean值和判断语句。
  循环语句也不是FOR i=a TO b DO的形式,只能是LOOP n的形式。

  在这个系统上实现加法很容易,让a自增b次即可。现在的问题是,你能在这个系统上实现减法吗?


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  问题的关键在于如何实现自减一操作。
  本来让-1自增n次即可实现n的自减的,但系统偏偏又不支持负数。
  网友Dingding给出了一个答案:

tmp = 0
result = 0
loop(n) {
   result = tmp
   tmp++
}

  这段代码执行后,result的值将变为n-1。注意到这段代码在自增时是如何巧妙地延迟了一步的。
  现在,我们相当于有了自减一的函数dec。实现a-b只需要令a自减b次即可:

result = a
loop(b) {
   dec(result)
}

26 条评论

发表评论

1  +  5  =