【问题标题】:Confused in understanding recursion对递归的理解感到困惑
【发布时间】:2013-05-15 22:07:28
【问题描述】:

我对以下代码有点困惑查找树的高度和递归查找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。如果上面的树代码返回,为什么它不返回递归数?

【问题讨论】:

  • 兄弟,我能理解递归逻辑,但我不明白上面的两个变量如何存储每个子树的级别......
  • 阅读最佳答案并将示例与他的解释一起工作。一旦你完成了这两个,这将变得显而易见
  • 是的,兄弟...我想你还不了解我...我确实理解了recusion,但对这两个变量有点困惑...请阅读我发表的评论@Mohamed并解释我....

标签: c data-structures recursion


【解决方案1】:

你的第二次递归相当于

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() recurssion 执行相同的操作,您应该在 findsum() 函数的末尾返回 sum+1 而不是 sum

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+1 (n);

【讨论】:

  • 感谢您提供的解决方案以找到回避的编号...您能否解释一下lheightrheight 如何正确输出树的级别???
  • @abu lheightrheight 返回树级别,因为在递归函数中,两个变量都使用 1 递增:
  • @abu 和 sum = findSum(n-1); 的递归中没有 1 的增量
  • k bro..如果左子树的级别是 3 并且它是较大的,那么 lheight 持有的值是 2(在它通过递增返回之前)rit,我想让你澄清这一点(即)它如何存储值 2 是否拥有它所做的递归数???
  • 哦,是的,你明白我的意思...sum 在它返回之前的值是多少..bcoz 如果我包含一个 stmt cout&lt;&lt;"\nSum : "&lt;&lt;sum; 它只会打印为 0 直到它是返回...但是解决方案是正确的...
【解决方案2】:

我建议您在纸上执行此操作。如果我们为(未修改的)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。

【讨论】:

  • 谢谢你先生....但是我想知道的是上面两个变量是如何存储每个子树的级别的....
  • @abu 在纸上追踪一棵小树的函数。甚至可以在调试器中单步调试一棵小树的代码。真的很有帮助。
  • @abu 也许我的回答可以帮助你。试一试。
【解决方案3】:

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

如果你举个例子,这会更容易理解。

在附图中,我们从根 F 开始。我们检查根是否为空,如果不是,我们找到右子树和左子树的高度,取多者添加再给它一个并返回。这就是我们手动操作的方式。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2012-03-22
    • 2012-03-01
    • 2018-11-13
    • 2014-07-28
    • 2013-01-13
    • 2021-10-22
    相关资源
    最近更新 更多