这几个星期来一直在递归里折腾,发觉它还真是一个好东东,对于“懒人”来说。当然这个懒人打上了引号,并不是真正的懒,而是在看清问题本质后用最简洁的方式表达出来让计算机去执行。她比起非递归,更加显得浅显,但是却不是那么易懂。而有些复杂问题的非递归方法,看得很明白,但是绕了太多的弯后突然发现不了自己思维的轨迹了,回去一两步可能还找的到,但是再多些就没印象了,完全被里面的各种运算所掩埋,看不清~~。
递归发现了些东东:
int Countnode(Property *T,int *i)
{
if(T!=NULL){
(*i)++;
Countnode(T->firstchild,i);
Countnode(T->nextsibling,i);
}
}
此处用了递归的便利,同时外部传入地址,通过这个递归过程去改变此地址所在单位的值,以此达到计数的目的,很好,很明白。
另外我从网络上看到的一种方法:
void binarytree_count(BinaryTree *root)
{
BinaryTree *node;int count;
/*使用辅助队列,设进队函数为void in(BinaryTree* Node),出队函数为BinaryTree *out(),判断队列空的函数int isempty()*/
in(root)
while(!isempty())
{
node=out();
if(node->left!=null) in(node->left);
if(node->right!=null) in(node->right);
if(node->left!=null||node->right!=null) count++;
}
return count;
}
通过队列的方式来实现,看来也很好,但是简洁性好像没上面那么高。各有千秋~~(未完待续)