从带有C中列表的递归组合打印

时间:2019-03-24 22:21:05

标签: c list recursion

我想了解以下代码:

struct element{
   element *a1;
   element *a2;
   int value;
};

void main(){
    element e6 = { NULL, NULL, 6 };
    element e2 = { NULL, NULL, 2 };
    element e4 = { NULL, NULL, 4 };
    element e7 = { &e6, NULL, 7 };
    element e9 = { NULL, NULL, 9 };
    element e3 = { &e2, &e4, 3 };
    element e8 = { &e7, &e9, 8 };
    element e5 = { &e3, &e8, 5 };

   cout << CountList(&e5) << endl;

return;}

int CountList(element *e){
   int c=1;
   if(e){
      c=c+CountList(e->a1);
      c=c+CountList(e->a2);
      return c;}
    return 0;
}

计数为8。但是我如何理解递归线? 我的想法是,Count必须为6,因为递归函数仅被调用4次。编译器说8,这已经是正确的解决方案。但是为什么?

2 个答案:

答案 0 :(得分:1)

这是一棵树

            e5
           /  \
         e3    e8
        / \    / \
      e2  e4 e7   e9
              |
             e6

递归函数从e5开始,首先使用e3进行自身调用,然后依次使用e2进行调用,另一个使用NULL的调用返回(返回e2)。

e2另一边的呼叫也为NULL,然后返回(到e3)。

e3e4的调用,该调用只有NULL子代并返回(到e3)。

从那里,e3返回到e5,后者称为另一边(e8)...

每个非NULL元素将自身计数为1,并添加到非NULL子代中。

总共给出8个。树中元素的数量。


递归函数的调用次数至少为8,以访问所有子级。如果您使用NULL元素(9)来计算呼叫次数,则呼叫总数为17。

答案 1 :(得分:0)

它实际上不是列表,而是一种二叉树。

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.didTap(_:)))
textView.addGestureRecognizer(tapGesture)

@objc func didTap(_ gesture: UITapGestureRecognizer) {
    // Handle the tap
}

在这里,您计算当前元素(1个项目):

int CountList(element *e){

然后,添加第一个子树中计数的元素数:

   int c=1;
   if(e){

然后添加第二个子树中计数的元素数:

      c=c+CountList(e->a1);

总计元素总数:

      c=c+CountList(e->a2);

如果当前元素为NULL(空树),则返回 return c; }

0

这就是全部。