理解递归时感到困惑

时间:2013-05-21 08:00:55

标签: c data-structures recursion

我对下面的代码有点困惑,以找到树的高度和递归查找sum of n nos的代码,低于此值。 lheightrheight存储什么,具体取决于它的递归次数?

int height(struct node* node)
{
   if (node==NULL)
       return 0;
   else
   {
     lheight = height(node->left);
     rheight = height(node->right);
     if (lheight > rheight)
         return(lheight+1);
     else return(rheight+1);     
   }
}

这是另外一个澄清,它打印n nos

的总和
int findSum(int n){
    int sum;
    if(n <= 0) return 0;
    else sum = n + findSum(n-1);
    return sum;
}

如果我将其更改为:

int findSum(int n){
    int sum;
    if(n <= 0) return 0;
    else sum = findSum(n-1); // here
    return sum;
}

它将输出打印为0.如果上面的树代码没有,为什么不返回递归次数?

3 个答案:

答案 0 :(得分:3)

您的第二次递归相当于

sum = findSum(n-1) = findSum(n-2) = findSum(n-3) = ..... = findSum(0) = 0;

如果您希望第二次递归返回递归次数,请使用

sum = 1 + findSum(n-1);

lheightrheight返回树级别,因为在递归函数中,两个变量都有1递增:

     return(lheight+1);
 else return(rheight+1);     

如果您希望findsum()执行与height()同步相同的操作,则应在sum+1功能结束时返回sum而不是findsum()

int findSum(int n){
    int sum;
    if(n <= 0) return 0;
    else sum = findSum(n-1);
    return sum+1; //<<<<< should return sum +1 as you did in the height function
}

只有在

时才会评估return sum+1;

findSum(n-1); findSum(n-2); findSum(n-3); ... findSum(0);被称为。

  • 调用findSum(0)时,会返回0;
  • 调用findSum(1)时,会执行sum=findSum(0)(所以sum = 0),然后返回sum+11);
  • 调用findSum(2)时,会执行sum=findSum(1)(所以sum = 1),然后返回sum+12);
  • 调用findSum(3)时,会执行sum=findSum(2)(所以sum = 2),然后返回sum+13);
  • 调用findSum(n)时,它将执行sum=findSum(n-1)(所以 sum = n-1)然后返回sum+1n);

答案 1 :(得分:1)

我建议你在纸上这样做。如果我们为(未修改的)findSum函数执行此操作,它将是这样的:

不要说你称之为

findSum(2);

这将阅读以下步骤:

1: sum = 2 + findSum(2 - 1);

将调用导致

findSum(1)
2: sum = 1 + findSum(1 - 1);

调用findSum(0)

3: return 0;

现在我们向后退一步到2

2: sum = 1 + 0;

再次备份:

1: sum = 2 + 1

所以findSum(2)的结果是3。

答案 2 :(得分:1)

lheight和rheight只不过是在树的特定级别上左子树和右子树的高度。

如果你举一个例子,这可以更容易理解。 Tree

在附图中,我们从根F开始。我们检查root是否为null,并且由于它不是,我们找到右子树和左子树的高度,以及更多,我们添加还有一个并返回。这就是我们手动完成的方法。

现在在找到左子树的高度时,我们递归地向下,直到我们到达空指针,此时我们返回0.因此A的值返回为0,然后我们检查右子的高度树(即D),为此我们递归地向下直到C,返回0,同样0返回0.我们在C和E的最大值(即0)中加1,并将其返回到上一级。现在我们的A值为0,D值为1,我们将最大值加1(即1)并将其返回到上一级。这是完整树的左子树的高度,类似地计算右子树的高度。