腾讯的递归笔试题目

今天在北邮人上看到的腾讯的笔试题目:一道递归算法的题目:

题目是这样的:

   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)的例子是很好的,并且可以验证自己的思考是否正确!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值