`
mixer_a
  • 浏览: 356920 次
社区版块
存档分类
最新评论

关于笔算递归的通用算法——迭代

 
阅读更多

递归是是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象。

在我的印象中,我第一次接触递归是在C语言书中,让求n!的解,记得程序如下:

函数的调用对应着入栈,调用的结束对应着出栈,如上面的过程,假如传入的参数为3,程序run的时候,会先将fun(3)入栈,接着会将fun(2)入栈,最后会将fun(1)入栈,计算结束之后,会按照fun(1),fun(2),fun(3)依次出栈。从上面的过程我们可以看出,在每次计算的时候,该项的结果都会依附前一项,前一项的结果依附前一项的前一项,以此类推,知道递归的终止条件。这是计算机在遇到递归的时候的做法。

假如我们现在在进行人生很重要的一次笔试,笔试题中给出了一个递归函数,给了你一个参数,你还要像计算机一样子,从外到内一层一层计算吗?如果从外到内计算的话,最后的结果很可能是你自己把自己给绕进去了。

下面提供一种比较通用的人算递归的解法:

从递归终止的条件开始,一项项的向后推,如果递归函数的参数有一个,则建立一个一维数组,如果参数有n个,则建立一个n维数组。还用上面的例子,首先建立一个数组,长度为3(因为给定的参数为3,而且在函数中,不会出现比参数更大的值),先计算fun(1),结果为1,再计算fun(2),fun(2)依附fun(1),fun(1)的结果在前面已经算出来了,存放在一维数组中,所以可以直接用,不用再算,以此类推,最后可以很容易算出fun(3)。

如果要给上面的算法归类,它应该是迭代算法。迭代算法是只根据迭代公式(递推公式),从起始项(递归终止项)开始,一步步计算,直到得到想要的结果。

下面再看一个例子,ackerman递归的求解算法,该算法出现在过一家大公司的笔试题中,当时直接就被搞晕了,结束之后,就总结一下人解递归的方法,于是就有了这篇博客。

ackerman算法程序如下:

给定的参数为m=3,n=3,即让求解ack(3,3)的值,当时一看到题,就直接从外到内一层一层的算,没算几步,就把自己给绕进去了。如果用动态规划的话,首先建立一个二位数组,大小应该3*3的,如果不够还需要增加大小。
其实在写程序的时候,应该尽量避免使用递归,将递归转换成迭代算法,可以减少很多运算,因为使用递归的时候,有些值已经在前面算出来过了,在后面还需要再算一次,迭代可以很好解决这一弊端。或许有人该问了,既然递归可以用迭代代替,为什么还有递归?个人觉得,递归是一种思想,可以利用这种思想解决问题,在实现的时候,可以转换成迭代。

分享到:
评论

相关推荐

    递归算法——STL

    **递归算法与STL在C++中的应用** 递归算法是编程中一种重要的思想,它通过函数调用自身来解决问题。在C++中,递归可以与标准模板库(STL)结合,以实现更高效、简洁的代码。本文将深入探讨递归算法的应用,特别是...

    递归与迭代算法及其在JAVA语言中的应用.pdf

    递归与迭代是算法设计中两种常见的解决问题的方法,它们在Java语言中的应用广泛且具有深远的意义。递归算法通过方法内部调用自身来解决问题,它适合于可以分解为相似子问题的问题;而迭代算法则通过循环结构,不断...

    RSA基本递归算法——实验用

    RSA基本递归算法,简单,基本,快速,大模运算的基本方法

    递归算法举例——八皇后问题详解

    递 归 算 法 举 例——八皇后问题详解,和大家分享~

    算法和数据结构——迭代和递推(上).pdf

    首先,“算法和数据结构——迭代和递推(上)”这个标题提示了文档将讨论算法领域中非常核心的两个概念:迭代(Iteration)和递归(Recursion)。这两者在计算机科学中用于实现程序的重复操作和问题求解的基本方法。...

    牛顿迭代算法与递归算法的概念和区别

    牛顿迭代算法与递归算法的概念和区别 牛顿迭代算法和递归算法是两种常用的算法思想,它们在解决问题时具有不同的特点和应用场景。 牛顿迭代算法是一种数值分析方法,用于寻找函数的零点或极值点。该算法的基本思想...

    实验2 二分检索的递归与迭代算法设计(报告).doc

    二分检索的递归与迭代算法设计 二分检索是计算机科学中一种常用的搜索算法,这种算法可以在有序数组中快速地查找某个元素。二分检索算法可以分为递归算法和迭代算法两种。递归算法是一种top-down的算法,通过将问题...

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

    非递归算法在处理迭代过程时非常有效,尤其是在需要显式控制迭代流程的情况下。 ### 示例分析 为了更好地理解递归与非递归算法的区别,我们可以通过计算阶乘的例子来具体分析: #### 递归算法示例 ```java public...

    java算法——汉诺塔经典的递归

    汉诺塔——经典的递归 *实现移动函数 *递归实现汉诺塔函数

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

    非递归算法,也称为迭代算法,通常使用堆栈或队列来模拟递归行为,而避免了函数的多次调用。在遍历文件系统时,它会将目录添加到数据结构中,然后依次处理这些目录,直到找到目标文件或遍历完所有目录。非递归算法在...

    迭代与递归算法

    在编程和算法设计中,迭代和递归是两种常见的解决问题的方法。它们在处理循环和层次结构问题时尤其重要,尤其在C语言和其他编程语言中。本文将深入探讨这两种方法,以及它们在实际应用中的差异。 **迭代算法**是...

    .net 递归算法 .net 递归算法.net 递归算法

    在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...

    abap简单递归算法

    本文将深入探讨一个ABAP中的简单递归算法——计算阶乘,并通过SE38报表的形式进行展示。 #### 二、递归算法简介 递归算法是一种通过调用自身来解决问题的方法。它通常用于解决那些可以通过子问题的解来构建整个...

    acm递归算法总结竞赛

    在ACM(国际大学生程序设计竞赛)中,递归算法是一种常见的解决问题的方法,它通过函数自身调用自身来实现问题的解决。递归的核心在于找到基本情况(base case),即可以直接求解的问题,以及每次递归调用时问题规模...

    算法思想——递归与分治

    算法思想——递归与分治 递归和分治是两种常用的算法思想,它们可以单独使用,也可以结合使用以解决复杂的问题。下面我们将详细探讨这两种算法思想。 递归是一种算法思想,它的基本思想是将一个问题分解成一个或多...

    c语言-阶乘算法(迭代和递归).docx

    C语言-阶乘算法(迭代和递归) C语言-阶乘算法是计算阶乘的经典算法,包括迭代算法和递归算法两种实现方式。阶乘是数学中的一种运算符号,表示一个数字的所有正整数因子的乘积,如n! = n * (n-1) * (n-2) * (n-3) * ....

    使用C++,请给出此题的递归算法及非递归算法。

    非递归算法,如迭代,通常使用循环结构来避免这些问题。对于上面的阶乘问题,我们可以用以下非递归方式实现: ```cpp int factorial(int n) { int result = 1; for (int i = 2; i ; ++i) { result *= i; } ...

Global site tag (gtag.js) - Google Analytics