十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
非递归和递归之间
目前创新互联建站已为成百上千家的企业提供了网站建设、域名、网络空间、网站托管、企业网站设计、尚志网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
1速度。递归函数是在不断的调用本身的函数,一般函数的调用.返回,是比较费时间的,尤其是在递归深度较大时。所以个人觉得非递归的速度较好。
2.空间。递归函数很明显,始终是在入栈,只有在最后才出栈,大量的浪费了堆栈空间。在这一点上非递归肯定要比递归好。
总结。个人认为递归函数只是在程序书写上简单明了,但实际运行个人不看好。
一个是O(N) 一个是O(N*N)
递归是对递推关系的模拟;
你的问题,有什么样的递推结构,在什么情况下,不需要递推,可以直接得出结论。
了解了这些情况,你就可以着手写代码了。
这样的代码,自然就,以递归函数实现,最方便了。
1)那种可以,直接解决问题的情况,自然就是直接返回的条件了。
2)那种需要递推,才可以解决的,自然就写成,递归调用了。
3)那种实际的,执行代码,自然就夹在,递归调用之间,写出来了。
写递归函数,主要分析,
1)何时结束
2)何时递归调用
3) 执行任务的代码写在哪里。
递归调用本身,并不是解决,实际问题的方案。只是解决复杂结构问题的,一种方法。
解决实际问题时,要结合所执行的任务来写代码。
比如,树的遍历。
递归只是个框架,执行遍历本身要干什么,比如打印节点数据,这才是递归函数的任务。
一个框架搭起来了,可以解决一批相同结构的问题。
然而一个空的框架,什么问题也解决不了。即使搭的再好,也无用。
1、递归就是函数调用函数本身,运行起来就是函数嵌套函数,层层嵌套,所以函数调用、参数堆栈都是不小的开销,但是程序简单。
2、非递归就是不断地对参数入栈、出栈,省去了函数层层展开、层层调用的开销。虽然参数出入栈次数多了,但是一般都开辟固定的足够大的内存来一次性开辟、重复使用。
3、非递归是从堆栈的角度来编写程序,速度快,但代码复杂。
递归是从问题本身的逻辑角度来编写,虽然速度相对慢,但代码容易理解。
如果对速度要求不高,建议用递归方式。
4、摘录例子如下:
#include stdio.h
#include stdlib.h
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;//二叉树的节点类型
typedef struct QNode
{
BiTNode data;
struct QNode *next;
} QNode,*QueuePtr;//队列节点类型
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;//队列的头尾指针
void InitQueue(LinkQueue *Q)//创建队列
{
Q-front=Q-rear=(QueuePtr)malloc(sizeof(QNode));
Q-rear-next=NULL;
}
void EnQueue(LinkQueue *Q,BiTNode e)//入队操作
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
p-data=e;
p-next=NULL;
Q-rear-next=p;
Q-rear=p;
}
BiTNode DeQueue(LinkQueue *Q)//出对操作
{
BiTNode e;QueuePtr p;
p=Q-front-next;
e=p-data;
Q-front-next=p-next;
if(Q-rear==p)
Q-rear=Q-front;
free(p);
return (e);
}
int QueueEmpty(LinkQueue *Q)//判断队列是否为空
{
if(Q-front==Q-rear )
return 1;
else
return 0;
}
BiTree CreateBiTree()//创建二叉树
{
char p;BiTree T;
scanf("%c",p);
if(p==' ')
T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
T-data=p;
T-lchild=CreateBiTree(T-lchild);
T-rchild=CreateBiTree(T-rchild);
}
return (T);
}
void PreOrder(BiTree T)//先序
{
if(T!=NULL)
{
printf("%c",T-data);
PreOrder(T-lchild);
PreOrder(T-rchild);
}
}
void LevelOrder(BiTree T)//层次遍历
{
LinkQueue Q; BiTNode p;
InitQueue(Q);
EnQueue(Q,*T);
while(!QueueEmpty(Q))
{
p = DeQueue(Q);
printf("%c",p.data);
if(p.lchild!=NULL)
EnQueue(Q,*(p.lchild));
if(p.rchild!=NULL)
EnQueue(Q,*(p.rchild));
}
}
void main()
{
BiTree Ta;
Ta=CreateBiTree();
printf("层次遍历:");
printf("\n");
LevelOrder(Ta);
printf("\n");
printf("先序遍历:");
printf("\n");
PreOrder(Ta);
}
层次使用非递归的,用到队列
先序是用递归的
创建树使用先序递归建树
输入个例子:
abc**de*f**g***(注意*代表空格,因为空格你看不到就不好表示).
好像麻烦 没什么作用啊!阶乘我有for循环照样实现又简单!
int f(int n)//实现阶乘参数
{
int tem = 1;
for(;n0;n--)
{
tem*=n;
}
return tem;
}