看情况,再大部分的情况下循环和递归都是可以互换的。
如果你学的深一些,学到二叉树,栈和队列部分就会发现递归比循环好理解很多,也好用很多
二叉树的非递归代码难度比递归高得多,
举个例子
void InOrder(BTNode pRoot)
{
if(pRoot)
{
InOrder(pRoot->_pLeft);
printf("%c ",pRoot->_data);
InOrder(pRoot->_pRight);
}
}
这个是二叉树的先序遍历,只需要这些就能实现
void pre_traverse(BTree pTree)
{
PSTACK stack = create_stack(); //创建一个空栈
BTree node_pop; //用来保存出栈节点
BTree pCur = pTree;
//定义用来指向当前访问的节点的指针
//直到当前节点pCur为NULL且栈空时,循环结束
while(pCur || !is_empty(stack))
{
//从根节点开始,输出当前节点,并将其入栈,
//同时置其左孩子为当前节点,直至其没有左孩子,及当前节点为NULL 12 printf("%c ", pCur->data);
push_stack(stack,pCur);
pCur = pCur->pLchild;
//如果当前节点pCur为NULL且栈不空,则将栈顶节点出栈,
//同时置其右孩子为当前节点,循环判断,直至pCur不为空
while(!pCur && !is_empty(stack))
{
pCur = getTop(stack);
pop_stack(stack,&node_pop);
pCur = pCur->pRchild;
}
}
}
这个是二叉树的非递归先序遍历实现是不是还是递归简单多了^_^
据说32位或64位能表示的整数来说,循环快过递归无数倍,每个递归会发生两次函数调用。会重复计算16^n倍,而循环只有百来个内容的数组就足够保存64位的斐波那契数了。但是速度却是线性的只有计算n次。如果你计算n=100的话,用循环1秒不到就能出结果,而用递归的时间可能会长到没法想象。 拿台普通pc做实验,如果是正递归计算斐波那契数的话,n=44需要30秒,而循环只要002秒,如果n=100的话,普通递归估计算到你孙子死了还没给出结果,而循环只有005秒。 不过你可以用尾递归,时间复杂度是n,和循环一样快。
多重循环没有办法,只有多看几种用法积累经验,善于总结,将内循环的功能总结出来,由内到外层层理解。
递归实际上就是调用相同语句的不同函数,其中开设的变量你可以自己起另外名称加以区别,比如递归函数中开变量a,在第1次调用是你可以认为是a1,第2次a2,这样就不容易混淆了,同理,第1次调用的是函数fun1,第2次可理解调用的是fun2,也可以容易理解些。实际上递归在计算机中就是代码相同而数据完全独立存在的一组程序调用,节省的仅仅是语句代码,在数据层面上与单独调用函数没有什么区别。
递归,具体的我也说不清楚,一般用在比较特殊的地方,用求得的值作为参数再求值,依赖算出的结果,比如算派(π)
循环,我觉得主要用在做一些比较有规律的事情上,比如处理数组,循环输出数组或List中的数据,或者做排序和求和,在运行的时候不依赖之前的结果
这两种方法解决的事情不同,多写些程序就能体会出来,个人感觉循环学起来要比递归简单得多,但在处理一些算法问题的时候使用递归将比使用循环要更简单,更高效。
这是百度知道里部分介绍递归:
>
以上就是关于c中,感觉递归好难理解呀,可以用循环可以代替递归吗全部的内容,包括:c中,感觉递归好难理解呀,可以用循环可以代替递归吗、斐波那契数列在JAVA中使用递归和循环哪个更好、多重函数的循环和递归理解为什么怎么难等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)