如何跟踪递归函数C ++

时间:2011-04-17 20:01:11

标签: c++ function recursion

#include <iostream>
using namespace std;

int g(float A[] , int L , int H)
{
   if (L==H)
      if (A[L] > 0.0)
         return 1;
      else 
         return 0;
   int M = (L+H)/2;

   return g(A,L,M)+ g(A,M+1,H);
}
int main (void)
{       
   float A[] = {-1.5 ,3.1,-5.2,0.0};
   g(A,0,3);

   system ("pause");
   return 0;
}

它问我函数g返回什么以及函数做什么

这是我到目前为止所得到的

第一个电话是g(A,0,3) -total跳过IF语句,M = 1,因为它是一个int - 返回g(A,1,3)+ g(A,2 3)

第二次电话   - g(A,1,3)再次跳过if语句   - M = 0;   - g(A,2 3)再次跳过if语句   - M = 2;

第三个电话 -g(A,0,0,)   返回0 -g(A,3,3)   返回0;

所以它只返回0?

我猜它正在划分中间值和某种二分搜索?

2 个答案:

答案 0 :(得分:4)

这是一种复杂的方法来计算数组中有多少数字大于0.如果你尝试在编译器中运行它,返回值为1,因为数组中唯一大于0的数字是3.1

首次运行时:

{-1.5, 3.1, -5.2, 0.0}
   0    1     2    3
   L               H

然后从L=0H=3M = (0+3)/2 = 3/2 = 1到达g(A, L, M) + g(A, M+1, H)后,您将分为两个:

{-1.5, 3.1, -5.2, 0.0}
   0    1     2    3
   L               H
   L1   H1    L2   H2

让我们先做左侧部分g(A, L1, H1) = g(A, 0, 1)

{-1.5, 3.1, -5.2, 0.0}
   0    1     2    3
   L               H
   L1   H1    L2   H2
   ^^^^^^^

L1=0H1=1以及M1 = (0+1)/2 = 1/2 = 0以来又一次又分为两个g(A, 0, 0)g(A, 1, 1)

{-1.5,    3.1,    -5.2, 0.0}
   0       1        2    3
   L               H
   L1      H1      L2    H2
L11,H11 L12,H12
左侧部分的

,因为-1.5 <= 0因此g(A, L11, H11) = g(A, 0, 0) = 0位于右侧,因此3.1 > 0 g(A, L12, H12) = g(A, 1, 1) = 1 g(A, 0, 1) = g(A, 0, 0) + g(A, 1, 1) = 1

因此g(A, L2, H2)

g(A, L, H) = g(A, L1, H1) + g(A, L2, H2) = 1 + 0 = 1执行相同操作,然后获得{-1.5, 3.1, -5.2, 0.0}

@Nawaz很清楚将其可视化为二叉树,基本上你从树的根开始:

     {-1.5, 3.1, -5.2, 0.0}
              /   \
             /     \
            /       \
           /         \
   {-1.5, 3.1}    {-5.2, 0.0}

在第二层迭代中,将数组拆分为两个:

     {-1.5, 3.1, -5.2, 0.0}
              /   \
             /     \
            /       \
           /         \
   {-1.5, 3.1}    {-5.2, 0.0}
      /   \          /   \
     /     \        /     \
 {-1.5}   {3.1}  {-5.2}   {0.0}

在第三层,您再次拆分:

L==H

此时 {-1.5, 3.1, -5.2, 0.0} / \ / \ / \ / \ {-1.5, 3.1} {-5.2, 0.0} / \ / \ / \ / \ {-1.5} {3.1} {-5.2} {0.0} | | | | 0 1 0 0 所以,我们可以评估节点:

     {-1.5, 3.1, -5.2, 0.0}
              /   \
             /     \
            /       \
           /         \
   {-1.5, 3.1}    {-5.2, 0.0}
      0+1=1          0+0=0

并找到返回值,我们总结一下:

     {-1.5, 3.1, -5.2, 0.0}
             1+0=1

最后

{{1}}

答案 1 :(得分:3)

  

且M = 1,因为它是一个回归g(A,0,3)+ g(A,2 3)

这是第一个问题。如果M = 1,那你怎么说它是return g(A,0,3) + g(A,2, 3)

应该是:

return g(A,0,1) + g(A,2, 3)
           //^ this should be 1

由于你在第一步出错,所有连续的步骤都是错误的。

我的建议是:

  • 拿一支铅笔和一张白纸。准备好绘制向下扩展的二叉树
  • 将根节点写为g(A,0,3);。这是第一次电话。
  • 然后制作两个子节点:左和右
  • g(A,0,1)写为左侧节点,将g(A,2,3)写为右侧节点。
  • 然后再次为每个子节点创建两个子节点,并通过重复此步骤继续绘制节点,直到if条件成为真。
  • 一旦if条件成立,停止制作新节点(在该分支中),然后向上移向根节点,对在途中遇到的节点的值求和。
  • 您在根节点获得的是来自main()的原始呼叫的返回值。