我想了解以下代码:
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,这已经是正确的解决方案。但是为什么?
答案 0 :(得分:1)
这是一棵树
e5
/ \
e3 e8
/ \ / \
e2 e4 e7 e9
|
e6
递归函数从e5
开始,首先使用e3
进行自身调用,然后依次使用e2
进行调用,另一个使用NULL的调用返回(返回e2
)。
从e2
另一边的呼叫也为NULL,然后返回(到e3
)。
从e3
到e4
的调用,该调用只有NULL子代并返回(到e3
)。
从那里,e3
返回到e5
,后者称为另一边(e8
)...
每个非NULL元素将自身计数为1,并添加到非NULL子代中。
总共给出8个。树中元素的数量。
答案 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
这就是全部。