迭代 递归实例

在计算机编程实现中有常常两种方法:一曰迭代(iterate);二曰递归(recursion)。

从“编程之美”的角度看,可以借用一句非常经典的话:“迭代是人,递归是神!”来从宏观上对二者进行把握。

从概念上讲,递归就是指程序调用自身的编程思想,即一个函数调用本身;迭代是利用已知的变量值,根据递推公式不断演进得到变量新值得编程思想。

从直观上讲,递归是将大问题化为相同结构的小问题,从待求解的问题出发,一直分解到已经已知答案的最小问题为止,然后再逐级返回,从而得到大问题的解(一个非常形象的例子就是分类回归树 classification and regression tree,从root出发,先将root分解为另一个(root,sub-tree),就这样一直分解,直到遇到leafs后逐层返回);而迭代则是从已知值出发,通过递推式,不断更新变量新值,一直到能够解决要求的问题为止。

以斐波那契数列的求解为例,通过两种典型的实现进行对比:

fib(0)=0;

fib(1)=1;

fib(n)=fib(n-1)+fib(n-2);  

递归的实现

    int fib(int n){
         if(n>1) return fib(n-1) + fib(n-2);
         else return n; // n = 0, 1时给出recursion终止条件
    }  

迭代的实现

int fib(int n){
    int i, temp0, temp1, temp2;
    if(n<=1) return n;
    temp1 = 0;
    temp2 = 1;
    for(i = 2; i <= n; i++){
        temp0 = temp1 + temp2;
        temp2 = temp1;
        temp1 = temp0;
    }
    return temp0;
} 

下面就对递归和迭代进行比较:

递归实际上不断地深层调用函数,直到函数有返回才会逐层的返回,因此,递归涉及到运行时的堆栈开销(参数必须压入堆栈保存,直到该层函数调用返回为止),所以有可能导致堆栈溢出的错误;但是递归编程所体现的思想正是人们追求简洁、将问题交给计算机,以及将大问题分解为相同小问题从而解决大问题的动机。

迭代大部分时候需要人为的对问题进行剖析,将问题转变为一次次的迭代来逼近答案。迭代不像递归一样对堆栈有一定的要求,另外一旦问题剖析完毕,就可以很容易的通过循环加以实现。迭代的效率高,但却不太容易理解,当遇到数据结构的设计时,比如图‘表、二叉树、网格等问题时,使用就比较困难,而是用递归就能省掉人工思考解法的过程,只需要不断的将问题分解直到返回就可以了。

总之,递归算法从思想上更加贴近人们处理问题的思路,而且所处的思想层级算是高层(神),而迭代则更加偏向于底层(人),所以从执行效率上来讲,底层(迭代)往往比高层(递归)来的高,但高层(递归)却能提供更加抽象的服务,更加的简洁。

从个人来讲,我非常认同“迭代是人,递归是神”!

转自  http://blog.csdn.net/LG1259156776/article/details/46849809

时间: 2024-10-11 22:01:55

迭代 递归实例的相关文章

101. 对称二叉树,c++迭代递归解法

101. 对称二叉树,c++迭代递归解法 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树?[1,2,2,3,4,4,3] 是对称的. 1 / 2 2 / \ / 3 4 4 3 但是下面这个?[1,2,2,null,3,null,3] 则不是镜像对称的: 1 / 2 2 \ 3 3 这道题可以用迭代和递归两种方法求解 迭代法代码如下,主要思想是,将树的左右分支放入两个队列中.因为题目是判断两个数是否对称,所以在将节点a的孩子放左队列时,先放a的右子结点,再放a的左子结点:在将节点b的孩子

【Tree】二叉树先序遍历 迭代 &amp; 递归

1 /*************************** 2 https://leetcode.com/problems/binary-tree-preorder-traversal/ 3 @date 2015.5.13 4 @description 5 用非递归方法对二叉树进行先序遍历 6 借助辅助栈 7 每次先访问根节点,把节点压入栈,再转向其左孩子,直至左子树的左孩子为空,依次将栈顶元素出栈,转向右孩子. 8 9 10 ****************************/ 11

6.3 迭代 递归

迭代器 count = 0while True:    if count ==101:        break    print(count)    count += 1     python中一切皆对象 height = 180salary = 3.2name = 'nick'hobby_list1 = ['run','read']hobby_tup = ('run','read')info_dict1 = {'name':'nick','weight':140}hobby_set = {'

递归实例分析

1.公园里面有200个桃子,每天吃掉一半,扔掉一个烂的,第六天剩余多少个桃子? var sl=200;i=0; for(i=0;i<6;i++){ sl=parseInt(sl/2-1); } alert(sl); 2.公园里有一堆桃子,猴子每天吃掉一半,扔掉一个烂的,第六天剩余1个桃子,问刚开始有多少个桃子 var sl=1;i=0; for(i=0;i<6;i++){ sl=(sl+1)*2; } alert(sl); 递归:特点:自己调用自己 function shuLiang(ts){

递归实例详解

C通过运行时堆栈支持递归函数的实现.递归函数就是直接或间接调用自身的函数.许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的<C语言程序设计>一书中就是从阶乘的计算开始的函数递归.导致读过这本经书的同学们,看到阶乘计算第一个想法就是递归.但是在阶乘的计算里,递归并没有提供任何优越之处.在菲波那契数列中,它的效率更是低的非常恐怖. 这里有一个简单的程序,可用于说明递归.程序的目的是把一个整数从二进制形式转换为可打印的字符形式.例如:给出一个值4267,我们需要

递归实例,欢迎大家修改优化

问题一 昨天同事提了一个问题:有50个学生站成圆圈(学号为1~50),从1开始报数,报数为4的倍数的学生离开圆圈,剩下的继续报数直至全部离开,问最后一个离开圆圈的是哪个同学? 说这个能使用递归实现了话请大家吃饭,赶紧上代码,今天大家等着吃饭呢! 1 /** 2 * 获取最后一个离开圆圈的学生 3 * @param list 学生学号集合 4 * @param hao 即将报的数 5 * @return 6 */ 7 public static List<Integer> getNum(List

递归实例

学习前提: 自己了解递归定义.多个字符串连接.sprintf()的用法和注意[*].<< 左移符号知识.二叉树中序遍历等. 题目描述: FJ的字符串 FJ在沙盘上写了这样一些字符串: A1 = “A” A2 = “ABA” A3 = “ABACABA” A4 = “ABACABADABACABA” … … 你能找出其中的规律并写所有的数列AN吗? 输入格式: 仅有一个数:N ≤ 26. 输出格式: 请输出相应的字符串AN,以一个换行符结束.输出中不得含有多余的空格或换行.回车符. 样例输入:

栈与递归实例

1.#include <stdio.h> void reverse(char* s){    if( (s != NULL) && (*s != '\0') )    {        reverse(s + 1);                printf(" %c", *s);    }} int main(){    reverse("12345");        printf("\n");        r

POJ 1753 Flip Game (迭代递归)

POJ 1753,题目链接http://poj.org/problem?id=1753. POJ 1753,题目链接http://poj.org/problem?id=1753. 总共有16个点.对某个点选择操作或者不操作.一共有2^16次方种可能. 从前往后枚举,保证不重复. 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<algorithm> 5 #includ