leiyahui

纸上得来终觉浅,绝知此事要躬行
栈与递归函数

一 递归的定义

对于一个定义:<定义对象>=<定义描述>

        (左部)    (右部)

即定义的右部又出现定义的左部的形式,即称为一个递归定义

二 递归函数到非递归函数的转化

将递归函数转化为非递归函数主要是因为以下两个原因

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;

}

 

posted on 2015-11-17 16:13  雷大叔  阅读(332)  评论(0)    收藏  举报