一、递归

   程序调用自身的编程技巧称为递归( 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. LED与OLED的区别:

    LED与OLED的区别: led和oled的发光原理是一样的,只 不过区别是用的材料不一样led用的是金属材料,而oled用的是有机物材料. OLED不需要背光源,自己本身会发光,是采用发光二极管阵列 ...

  2. Android真机调测Profiler

    U3D中的Profile也是可以直接在链接安卓设备运行游戏下查看的,导出真机链接U3D的Profile看数据,这样能更好的测试具体原因. 大概看了下官方的做法,看了几张帖子顺带把做法记录下来. 参考: ...

  3. bzoj3453: tyvj 1858 XLkxc(拉格朗日插值)

    传送门 \(f(n)=\sum_{i=1}^ni^k\),这是自然数幂次和,是一个以\(n\)为自变量的\(k+1\)次多项式 \(g(n)=\sum_{i=1}^nf(i)\),因为这东西差分之后是 ...

  4. 学习Mahout(二)

    继续上一篇博客. 这篇博客介绍如何跑一下mahout自带的Hello world程序 我将mahout 安装在/opt/hadoop/mahout-distribution-0.9 cd /opt/h ...

  5. A. Office Keys ( Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) )

    #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm& ...

  6. PAT甲级——1123 Is It a Complete AVL Tree (完全AVL树的判断)

    嫌排版乱的话可以移步我的CSDN:https://blog.csdn.net/weixin_44385565/article/details/89390802 An AVL tree is a sel ...

  7. B.选点

    链接:https://ac.nowcoder.com/acm/contest/368/B 题意: 有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi.现在要选出尽量多的点. 对于任意一棵子树,都 ...

  8. 关于php和docker

    Docker在PHP项目开发环境中的应用 http://www.wolonge.com/zhuanlan/detail/117441 Docker在PHP项目开发环境中的应用 http://linux ...

  9. AJPFX关于延迟加载的单例模式的安全问题解决

    请写一个延迟加载的单例模式?写懒汉式:当出现多线程访问时怎么解决?加同步,解决安全问题:效率高吗?不高:怎样解决?通过双重判断的形式解决.懒汉式:延迟加载方式.当多线程访问懒汉式时,因为懒汉式的方法内 ...

  10. linux增加系统监视器的快捷键

    系统命令:gnome-system-monitor 可在终端输入调用 在系统相应的快捷键设置区设置即可