【问题标题】:Can you explain this code about recursion in linked list你能解释一下关于链表中递归的这段代码吗
【发布时间】:2016-05-14 04:30:36
【问题描述】:

问题是添加两个链表,就像添加整数一样。这是问题中的求和函数。

n1 和 n2 是两个链表的头节点,要加入到 l3 中。现在在这段代码中我不理解递归部分。

在像斐波那契或阶乘这样的正常递归中,我们在代码中有一个条件,说明递归应该何时结束。这里没有这样的条件。你能解释一下它是如何结束的吗?

    int addNode(Node* n1,Node* n2,List* l3)
    {
        if(n1==NULL)
              return 0;
        int carry=addNode(n1->getNode(),n2->getNode(),l3);
        int val=carry+n1->getdata()+n2->getdata();
        int carry1=val/10;
        int quot=val%10;
        l3->prepend(quot);
        return carry1;
    }

【问题讨论】:

  • "我们在代码中有一个条件说明递归应该何时结束。这里没有这样的条件。"。这里是if(n1==NULL) return 0;

标签: recursion linked-list


【解决方案1】:

答案在 cmets 中:

if(n1==NULL) 是停止递归的条件。

【讨论】:

    【解决方案2】:

    如果您采用斐波那契递归,它在停止递归方面的工作方式类似。

    这是斐波那契的代码 sn-p

    int fibonacci(int n)  {
        if(n == 0)
            return 0;
        else if(n == 1)
          return 1;
        else
          return fibonacci(n - 1) + fibonacci(n - 2);
    }
    

    请注意如何检查if (n == 0) 的条件与您所拥有的if (n1 == NULL) 的逻辑相同,并且在这两种情况下,您return 0 都会中断该方法。

    一旦发生这种情况,递归就会向上,这意味着对于每次迭代,方法的其余部分都会被调用并返回并退出。在您的示例中,返回了 carry1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多