• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

MarkGrid

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

递归转非递归

转自:http://www.cnblogs.com/kwklover/archive/2006/04/08/369923.html

问:为什么要递归转非递归?
答:因为每一次的递归调用都需要压栈占用内存,效率不高。

 

一般的递归方法(以求阶乘为例):

unsigned long long Recursive(unsigned long long n)
{
    if (n > 1)
    {
        return n * Recursive(n - 1);
    }
    else if (n == 1)
    {
        return 1;
    }
}
View Code

 

递归转非递归的两种方法:

循环非递归法:

unsigned long long NoRecursiveByLoop(unsigned long long n)
{
    int k = 1;
    int t = 1;
    while (k <= n)
    {
        t *= k;
        k++;
    }
    
    return t;
}
View Code

自定义堆栈非递归法:

unsigned long long NoRecursiveByStack(unsigned long long n)
{
    Stack<int> s = new Stack<int>();
    int t = 1;
    int temp;
    s.Push(n);
    while ((temp = s.Peek()) != 1)
    {
        t *= s.Peek();
        s.Pop();
        s.Push(temp - 1);
    }
    return t;
}
View Code

 

posted on 2013-06-14 12:51  MarkGrid  阅读(148)  评论(1)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3