一、递归

   程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

   递归的三个条件:
   边界条件
   递归前进段
   递归返回段
   当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
二、迭代
   利用变量的原值推算出变量的一个新值.
三、递归、迭代解决相同问题举例:

1、递归实现

/**求一个数的阶乘*/                               
int f(int num){                                         
  if(num==1||num==0){          
    return 1;                                          
  }else{                     
    return num*f(num-1);         
  }                    
}

/**累加求和*/              
int f(int num){                                       
  if(num==1){                
    return 1;               
  }else{                    
    return num+f(num-1);        
  }                    
}

/**斐波那契数列*/
int f(int num){                                         
  if(num==1||num==2){          
    return 1;                 
  }else{                   
    return f(num-1)+f(num-2);       
  }                       
}                        

/*把一个十进制数转换为二进制*/
static void f1(int num){                            
  if(num==0){                
    return;                 
  }else{                 
    f1(num/2);                
  }                      
  System.out.print(num%2);        
}                        

2、迭代实现

累加、累乘略

/*斐波那契数列*/
int f2(int num){
  if(num==1||num==2){
    return 1;
  }
  int n1=1,n2=1;
  int target=0;
  for(int i=0;i<num-2;i++){
    target=n1+n2;
    n1=n2;
    n2=target;
  }
  return target;
}

/**一个十进制数转换为二进制*/
void f(int num){
  ArrayList a=new ArrayList();
  int n=0;
  while(num!=0){
    n=num%2;
    a.add(n);
    num=num/2;
  }
  for(int i=a.size()-1;i>=0;i--){
    System.out.print(a.get(i));
  }
}

四、递归和迭代比较

递归其实是方便了程序员难为了机器,递归的优点是可以使代码更简洁清晰,可读性好,且可以解决少数迭代解决不了的困难问题;缺点是递归有大量函数调用(产生额外时间开销)和栈内存的开辟(占用大量栈内存),对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终.

迭代虽然效率高,运行时间只因循环次数增加而增加,没什么额外开销,空间上也没有什么增加,但缺点就是不容易理解,编写复杂问题时困难。所以所有的迭代可以转换为递归,但递归不一定可以转换为迭代.

非递归函数虽然效率高,但却比较难编程,而且相对来说可读性差。   
现代程序设计的目标主要是可读性好。随着计算机硬件性能的不断提高,程序在更多的场合优先考虑可读而不是高效,所以,鼓励用递归函数实现程序思想。

javase(2)_递归&迭代的更多相关文章

  1. 算法基础_递归_求杨辉三角第m行第n个数字

    问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...

  2. 算法 递归 迭代 动态规划 斐波那契数列 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. SICP 关于递归迭代的重新理解以及尾递归的引入...

    看了线性的递归和迭代以及树形递归迭代这部分的内容,感觉对递归和迭代又有了新的理解...所以记录一下,也算对这部分内容的总结吧. 首先书中提到的递归与迭代和我以前想的有点不一样,我感觉书中提到的递归和迭 ...

  4. 020--python函数基础知识考试(包括:函数_递归等知识)

    1.列举布尔值为 False 的值 空,None,0, False, '', [], {}, () 2.写函数: 根据范围获取其中 3 和 7 整除的所有数的和,并返回调用者:符合条件的数字个数以及符 ...

  5. python基础-基础知识考试_day5 (包括:函数_递归等知识)

    老男孩 Python 基础知识练习(三) 1.列举布尔值为 False 的值空,None,0, False, '', [], {}, () 2.写函数:根据范围获取其中 3 和 7 整除的所有数的和, ...

  6. DNS 递归/迭代 原理

    递归查询 递归:客户端只发一次请求,要求对方给出最终结果.一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结 ...

  7. LeetCode145 Binary Tree Postorder Traversal Java题解(递归 迭代)

    题目: Given a binary tree, return the postorder traversal of its nodes' values. For example: Given bin ...

  8. [LeetCode题解]83. 删除排序链表中的重复元素 | 递归 + 迭代

    方法一:递归 解题思路 通过递归法,每次判断目前头节点与给定的节点是否相等.如是,继续判断下一个节点,否则保存当前头节点,设置 next 指向下次递归得到的节点,然后返回当前节点. 代码 /** * ...

  9. 【Warrior刷题笔记】剑指offer 6 24 35. 三道题,让你学会链表递归迭代辅助栈

    题目一 从尾到头打印链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-l ...

随机推荐

  1. 1.python真的是万恶之源么?(初识python)

    python真的是万恶之源么? 计算机基础及puthon了解 1.计算机基础知识 cpu : 相当于人类大脑,运算和处理问题 内存 : 临时存储数据,单点就消失,4G,8G,16G,32G 硬盘 : ...

  2. J - 吉哥系列故事――恨7不成妻

    #include "cstdio" #include "math.h" #include "cstring" #define mod 100 ...

  3. VLAN-5-802.1Q-in-Q隧道

    Q-in-Q允许SP在跨越WAN服务时,保留802.1Q VLAN标签.由此,VLAN可以被拓展到多个地理分散的站点上.     入向SP交换机收到802.1Q数据帧,使用额外的802.1Q头部来标记 ...

  4. servlet小型应用服务器搭建通过tomcat发布web项目

    1.servlet简介:Servlet 是一个 Java程序,是在服务器上运行以处理客户端请求并做出响应的程序 2.servlet的生命周期图解: 3.各阶段: 4.基本的servlet代码: pub ...

  5. socket编程模拟linux下的ssh代码实现

    实现思路: 1.提供输入指令的客户端: 2.提供返回执行指令结果的服务端 3.寻找服务端返回结果一次无法全部接收的解决思路 服务端代码(ssh_server.py) #coding=utf-8 imp ...

  6. Excel2Json记录

    1.有关配置的读取 import configparser import codecs #配置文件格式[config] #自定义的配置key=valuekey2=value2 读取配置 conf = ...

  7. linux下php以fastcgi模式运行

    关于PHP以fastcgi方式运行的文章,网络上较多,也许由于转载的原因,有些地方不甚明了,笔者亲自测试,整理成文,供大家参考. 1.linux系统 [root@localhost /]# cat / ...

  8. Partition(线段树的离线处理)

    有一点类似区间K值的求法. 这里有两颗树,一个是自己建的线段树,一个是题目中给定的树.以线段树和树进行区分. 首先离散化一下,以离散化后的结果建线段树,线段树的节点开了2维,一维保存当前以当前节点为权 ...

  9. SSM环境集成log4j

    本文只针对非Maven环境: 1.拷入log4j相关的.jar 2.在web.xml中配置 <!--由Spring载入的Log4j配置文件位置--> <context-param&g ...

  10. 流行的9个Java框架介绍: 优点、缺点等等

    流行的9个Java框架介绍: 优点.缺点等等 在 2018年,Java仍然是世界上最流行的编程语言.它拥有一个巨大的生态系统,在全世界有超过900万Java开发人员.虽然Java不是最直接的语言,但是 ...