`
zhangyu8374
  • 浏览: 94600 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基本算法连载(13)-递归程序转变成非递归

阅读更多
用堆栈实现递归其实并没有消除递归,只不过人工做了本来由编译器做的事情。真正的非递归是指运算时所需要的空间是常数,即所需空间与问题的输入规模无关。并非所有递归都可以转换成非递归,比如著名的Ackmann函数。
递归转非递归方法:
(1)用一般公式直接代替。象经常看到的斐波那契数列,它就存在通项公式,而无需采用递归实现。
(2)使用栈来实现
(3)通过Cooper变换、反演变换将一些递归转化为尾递归,从而迭代求出结果
至于什么是Cooper变换,反演变换,这可得好好研究数学。这里贴两个变换实例。

计算阶乘的递归实现(用Haskell实现的,谁都看得懂):f x = if x = 0 then 1 else f(x-1)*x;
第一步:转变成尾递归

int G(int x, int y)
{
int x1, y1;

if (x == 1) {
return 1 * y;
} else {
x1 = x - 1;
y1 = x *y;
return G(x1, y1);
}
}

int f(int x)
{
return G(x, 1);
}

第二步:转变成迭代

int G(int x, int y)
{
int x1, y1;

loop:
if (x == 1) {
return 1 * y;
} else {
x1 = x - 1;
y1 = x *y;
x = x1
y = y1;
goto loop;
}
}


求斐波那契值:
f x |x==0 =0
|x==1 =1
|otherwise = f (x-1)+f (x-2)

第一步:转变成尾递归
int fib(int n){
if(n==0)
return 0;
return _fib(n,1,0);
}

int _fib(int n,int f1,int f2){
if(n==1)
return f1;
return _fib(n-1,f1+f2,f1);
}

第二步:转变成迭代(略)
分享到:
评论

相关推荐

    基础算法-递归-杨鑫20191010.pptx

    基础算法-递归-杨鑫20191010.pptx,基础算法-递归-杨鑫20191010.pptx,基础算法-递归-杨鑫20191010.pptx

    算法-基础算法- 递归算法(包含源程序).rar

    本资源"算法-基础算法- 递归算法(包含源程序).rar"可能包含一个PDF文档,详尽地解释了递归算法的基本原理和实践应用,并可能提供了一些源代码示例,以便读者更好地理解和学习。 递归算法的核心在于两个主要组成...

    hannuota.rar_Hanoi_non-recursive_hannuota_汉诺塔_汉诺塔-递归算法_递归 非递归

    2. **非递归算法思路**:非递归算法通常使用循环和辅助栈来实现。首先,将n-1个盘子从A通过C移动到B,然后将第n个盘子直接从A移动到C,最后将B上的n-1个盘子通过A移动到C。 3. **算法步骤**: - 初始化:创建两个...

    SPT-05-递归程序设计.pdf

    递归程序设计是一种程序设计方法,其核心思想是函数直接或间接地调用自身来解决问题。在这一过程中,递归函数通过不断地划分问题直到达到基本情况(base case)来简化问题,然后再逐步解决每个子问题以构建最终解。...

    算法设计与实现-递归算法

    因此,递归算法可以转换为非递归形式,通常通过使用循环和堆栈来模拟递归调用的过程。例如,上面的阶乘函数可以改写为非递归形式: ```cpp int factorial(int n, int acc = 1) { for (int i = 2; i ; ++i) { acc ...

    5!递归算法和非递归算法

    递归算法和非递归算法 在计算机科学与编程领域中,递归算法与非递归算法是两种非常重要的计算方法。本文将详细介绍这两种算法的特点、应用场景以及如何实现它们,特别针对初学者及面试准备者。 #### 递归算法 ...

    快速选择非递归与递归算法实现

    以上就是关于快速选择算法的非递归和递归实现的详细介绍。通过合理地选取基准和适当的数据结构,快速选择算法可以在大数据集上提供高效的k-th最小元素查找服务。在Java中的`QuickSelect.java`文件中,应该包含了这些...

    myPrjTreeWidget-递归和非递归算法.rar

    在IT行业中,尤其是在软件开发领域,递归和非递归算法是解决问题的两种常见方法,特别是在处理层次结构数据,如树形结构时。QT库,一个C++的跨平台应用程序开发框架,提供了丰富的UI组件,其中包括QTreeWidget,用于...

    算法基础与递归-百积问题-递归求公约数-求阶乘-斐波那契数列

    递归算法的基本思想是将问题分解成更小的子问题,然后使用同样的方法解决这些子问题,直到问题的规模小到可以直接解决为止。本文将通过实验和代码实现,来详细介绍递归算法的原理和应用。 一、递归算法的原理 递归...

    阿克曼函数 c程序 递归与非递归算法的综合

    通过比较这两个程序,你可以看到递归和非递归算法在实现上的差异,以及它们在处理复杂递归问题时的不同策略。 理解并分析这两个程序,可以帮助你深入学习C语言编程,特别是递归和栈的概念。同时,这也为理解递归...

    NOIP普及讲座1-递归与分治(C++版).pdf

    ### 一、递归的基本概念 #### 定义: 递归是一种在程序设计中非常重要的方法,它指的是在一个函数或过程中直接或间接地调用自身来解决问题的技术。 #### 举例: 在数学上,所有偶数的集合可以通过递归的方式定义:...

    [Java算法设计]-递归阶乘.java

    文档中涵盖了递归阶乘的基本概念,包括如何使用递归计算阶乘以及如何在Java中实现递归阶乘。此外,文档还包括一个逐步指南,介绍如何在Java中实现递归阶乘的代码,包括详细的代码示例和实现细节。 文档还涵盖了高级...

    二叉树的操作--递归非递归遍历、结点个数、树深度

    非递归的先中後序, 计算出深度 结点数 /* 运行结果: ------------------------ 请先序输入二叉树(如:ab三个空格表示a为根节点,b为左子树的二叉树) ab c 先序递归遍历二叉树: a b c 先序非递归遍历二叉树: a b ...

    《数据结构与算法》-李春葆 实验报告-递归算法实践-n皇后问题

    "《数据结构与算法》-李春葆 实验报告-递归算法实践-n皇后问题" 本实验报告主要讲述了递归算法实践中的n皇后问题,旨在掌握堆栈这种数据结构的应用,实现递归,了解递归函数的执行过程、递归工作栈的相关概念与工作...

    LUT算法与数据结构-- 递归替换和图书管理

    本项目“LUT算法与数据结构-- 递归替换和图书管理”聚焦于这两方面,通过递归替换算法和图书管理系统的设计,来提升问题解决能力。 首先,让我们探讨“递归替换”这一概念。递归是一种解决问题的方法,它将复杂的...

    算法讲解教程-博弈问题-递归与循环-随机算法.zip

    深入探讨博弈问题中的算法策略,特别是递归与循环在解决这些问题时的应用。本教程将引导学习者理解如何利用递归思维分解复杂问题,以及如何通过循环实现高效的算法迭代。同时,还将介绍随机算法在博弈论中的应用,...

    VC对磁盘文件遍历搜索的递归算法和非递归算法

    在VC++(Visual C++)环境中,有多种方法可以实现这一目标,其中最常见的是递归算法和非递归算法。这两种方法各有优缺点,适用于不同的场景。 **递归算法**: 递归算法是一种基于函数自身调用解决问题的方法。在...

    0-1背包问题-递归算法 c语言实现

    根据给定的代码片段,我们可以看到一个实现0-1背包问题递归算法的C程序。下面对该代码进行详细的分析: 1. **预处理部分**: - 定义了若干变量,包括物品数量`n`、背包的最大承重`limitW`、所有物品的总价值`totV`...

Global site tag (gtag.js) - Google Analytics