今天在北邮人上看到的腾讯的笔试题目:一道递归算法的题目:
题目是这样的:
f(m, n ) = m + n + 1 , if m*n = 0
f(m, n) = f(m - 1, f(m, n - 1))
填空是:
top = 0;
do {
if (m*n > 0){
// 填空一
// 填空二
}else{
f = m + n + 1;
if (top > 0){
// 填空三
}
// 填空四
n = f;
}
}while (!(-1 == top));
printf("f = %d/n", f);
//解答过程:这是一道递归题目,说实话,第一次看到这种递归题目,还是感觉比较害怕,毕竟:f(m, n) = f(m - 1, f(m, n - 1)) 这种递归嵌套递归的,我还真是慌了。不过,慢慢经下来,举几个例子:就发现也不是很难,例如 f(1,0)=1+0+1=2;
f(1,1)=f(0,f(1,0))=f(0,2)=0+2+1=3;
这样看着题目就了解多了
看题目的top=0, 堆栈,递归的停止条件是top==-1,z 证明堆栈指针是先进栈,在 “++“
以计算f(1,1)的过程就是f(0),然后计算 f(1,0);
尝试填空:stack[top++]=m-1;
n=n-1; //注意m不能变,这个地方,开始的时候,我也犯糊涂了,后来看了北邮人的解法才明白:
在看else 的情况:
f(1,0)计算出来了,这个时候就需要出栈,m=stack[top-1]; top--;
这个地方其实也是:我也是觉得是stack[top--]就可以了,可是题目给了两个空,就不知道怎么填写了。
后来看了,才明白,这么不灵活,m-1,top-1;这种用法;
感觉还是考研的时候做1800的时候,那个时候背了好多递归的题目,平时用的很少,以后要注意积累! 看来递归的题目,看起来也没这么可怕,关键是先举了例子,然后才好进入状态,这个题目,f(1,1)的例子是很好的,并且可以验证自己的思考是否正确!