网友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)
}
a-b
=b自增到a的次数
回复:welco
a-b
=b自增到a的次数
关键是没有for(i=a; i<b;++i)这样的循环
只能loop(n)
设想这样一个计算机系统,它只支持以下几个操作:
1. 定义变量、给变量赋值;
2. 变量自身加一;
3. 令一段语句循环执行指定的次数。
dec函数哪来的…
这次百度的面试就问了这个题。。
出的很不错。。。
一直加啊加……直到撑破上界为止,这样是不是也可以实现……研究ing……
额,不存在溢出。。。
恩..在TP上看过了..无限强大的
嗯 这个延迟一步的思路很强大!
这种题目初看起来总是很吓人~
我昨天也看到这题了。
汗,在toplanguage上提问的人貌似就是我……
如果只有这三种语句的话,根本不可能去实现dec函数的啊。这个dec函数用的很暧昧!
这个题牛逼就牛逼在他可以做除法
loop(b){
tmp = 0
res = 0
loop(a){
res = tmp
tmp++
}
a = res
}
整个复杂度是O(a*b)。
这种系统处理A-B时,只有当A>=B时才会有正确的结果吧? 当A<B时,结果也为0? 因为处理不了负数,或者说对0做des操作时,结果还是0
除法能否这么做?
这个类似于丘奇数了
这个是错的。减法被抽象语法隐含了。想象一下这个高级语言程序被编译成汇编之后的情形:汇编里循环控制中必然会出现减法。
考虑loop(n)这个循环,可能的两种控制方法都绕不开减法。
A.初始化一个寄存器为n(赋值操作),每次递减直到为0后跳转(减法操作 + JEQ操作)。
B.初始化一个寄存器为0(赋值操作),每次递增(加法操作),递增后的值与常数n相减(减法操作),为0跳转(JEQ操作)。
/n./f./x.n (/g./h.h (g f)) (/u.x) (/u.u) 哇哈哈
不过这里的数字可不是普通的数字啊。。。
今天搜狗的笔试也是这道题,当时题目没看清,用了for循环语句,这个思路很棒
这个延迟一步的思路很强大!
loop (a) {
loop (b) {
result = 0;
}
result++;
}
//result = a – b;
ls 的 result=1 或 a
有了减法就有了判断,比较,if else。