栈与递归函数
一 递归的定义
对于一个定义:<定义对象>=<定义描述>
(左部) (右部)
即定义的右部又出现定义的左部的形式,即称为一个递归定义
二 递归函数到非递归函数的转化
将递归函数转化为非递归函数主要是因为以下两个原因
1 因为有些语言没有递归的功能
2 递归函数的空间和时间行比较差,因为处理递归过程系统内部需要反复进行进栈和出栈
所以对于一些常驻内存和资源紧张的程序,需要把递归问题转化为非递归问题
例子
一 设函数f(n)当n=0时f(n)=n+1,当n>0时f(n)=n*f(n/2)其中n>=0,n/2整除
(1)递归算法
int F1(int n)
{
if(n==0) return (n+1);
else
return (n*F1(n/2));
}
(2)非递归算法
int FF1(int n)
{
int f;
ClearStack(s);
while(n>0)
{
Push(S,n);
n=n/2;
}
f=1;
while(!Emptystack(S))
f=f*Pop(S);
return f;
}
二 设m,n为正整数,f(m,n)=m+n+1 当m*n=0;f(m,n)=f(m-1,f(m,n-1))当m*n!=0;
递归算法
int F1(int m,int n)
{
if(m*n==0)
{
return m+n+1;
}
else
{
return F1(m-1,F1(m,n-1));
}
非递归算法
int FF1(int m,int n)
{
int f;
ClearStack(S);
Push(S,-1);
do
{
if(m*n!=0)
{
Push(S,m-1);
n=n-1;
}
else
{
f=m+n+1;
if(!Emptystack(S)) m=Pop(S);
n=f;
}
}while(!Emtpystack(S))
return f;
}
浙公网安备 33010602011771号