为什么'static int'在递归计算链表的长度时会给出不同的答案?

时间:2015-09-07 15:57:08

标签: c recursion

我使用C递归计算链表的长度。

节点的结构如下: -

struct node {

      int num;
      struct node *ptr;
};

有两个指针 struct node * head (指向列表的头部)和另一个 struct node * temp ,它是用于迭代的指针整个清单。

用于计算长度的代码如下

int length(struct node *temp)
{
     int len=0;
     if(temp->ptr!=0)
       {
         len+=length(temp->ptr);
        }
    return (len+1);
}

这完全没问题。 但是,如果我使用 static int len = 0; 而不是int len = 0;它给出了随机的答案。

例如: -     如果列表是1-> 2-> 3-> 4-> 5,则值为16.

我假设在递归函数调用期间应该使用static,因为只有在这种条件下才会生成1个变量的副本。否则,每个函数调用都会复制并删除以前的值。

3 个答案:

答案 0 :(得分:0)

在您的代码中,len为静态时,添加到其中的值为

1 + 2 + 3 + 4 + 5 = 15

每个用于您正在进行的每个递归调用。

最后,你再次递增它,所以它到了16

要使代码生效,只需在条件len为真时递增if(temp->ptr!=0),然后为下一个节点调用length

答案 1 :(得分:0)

当len是静态的时,并不是每次调用长度都会增加相同的变量。

这里发生了什么

1->
   2->
      3->
         4->
            5
            add 1 to length (length = 1)
         add 2 to length (length = 3)
      add 3 to length (length = 6)
   add 4 to length (length = 10)
add 5 to length (length = 15)

return length + 1 (15 + 1)

16

当您使用本地长度(int length)时,在每次递归调用时,在此函数实例中将length设置为0.

答案 2 :(得分:0)

你为什么需要Len?

res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write(...);
res.write(...);
res.end();