javase_递归&迭代

一、递归

   程序调用自身的编程技巧称为递归( 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);        
  }                    
}

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

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

2、迭代实现

1. 累加、累乘略

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;
}

3./**一个十进制数转换为二进制*/
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));
  }
}

四、递归和迭代比较

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

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

普遍认为能用迭代的不用递归

时间: 2024-11-05 14:51:15

javase_递归&迭代的相关文章

编程算法 - 中序遍历 递归/迭代 代码(C)

中序遍历 递归/迭代 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 中序遍历(InOrder)作为二叉搜索树的排序方式, 有着重要的作用. 递归和迭代的方法都需要掌握, 迭代主要使用了栈(stack)进行输入输出. 代码: /* * main.cpp * * Created on: 2014.9.18 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #inclu

二叉树基本操作续二:前序、中序、后序遍历(非递归 迭代方式)

这里给出二叉树三种遍历方式的迭代实现代码.二叉树的递归实现使用系统栈入栈出栈,而非递归的迭代实现方法就是手动维护一个栈,来模拟递归的入栈出栈过程. 本文没有给出用户栈的代码,如果需要结合上篇的测试代码一起测试,则需要自己实现自己的栈,以及基本的pop.push等栈操作函数. 前序迭代遍历: 1 void iter_preorder(tree_pointer ptr) 2 { 3 //前序遍历:先遍历根节点,然后再分别遍历左右子树 4 int top = -1; 5 tree_pointer st

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

看了线性的递归和迭代以及树形递归迭代这部分的内容,感觉对递归和迭代又有了新的理解...所以记录一下,也算对这部分内容的总结吧. 首先书中提到的递归与迭代和我以前想的有点不一样,我感觉书中提到的递归和迭代是站在编译器/解释器的基础上来看的,而我之前是站在语言(类C语言的)的具体实现的角度看的.理解这个需要先看书中提到的两个概念: 1.递归过程                    2.递归的计算过程 可以用书中举出的阶乘的例子来看 实现1: 1 (factorial 6) 2 (* 6 (fact

尾递归=递归+迭代?

0 引言 平时见惯了递归和迭代,递归直观,但太占内存和时间,迭代运算快,但是不如递归代码简洁明了.那么可不可以把这两种算法的优点糅合在一起?答案是肯定的,尾递归就提供了这样一种机制. 1 尾递归是什么 简单地说,尾递归就是披着“递归”的外衣,却拥有一颗“迭代”的心.外观上看起来像递归,但内部进行了迭代的运算.下面举例说明. 2 阶乘示例 2.1 先看阶乘的迭代算法: 2.2 再看阶乘的递归算法: 2.3 最后看阶乘的尾递归算法: 3 斐波那契数列示例 3.1 先看斐波那契数列的迭代算法: 3.2

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

题目: Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. 解题: 递归的还是和前面中序和先序一样,只是交换一下顺序而已 public static List<Integer> result=new ArrayList<Integer>(); public

LeetCode94 BinaryTreeInorderTraversal Java题解(递归 迭代)

题目: Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. 解题: 中序遍历一颗二叉树,如果是递归就很简单了,中序遍历左+访问根节点+中序遍历右 就可以了.迭代的话,我是通过一个栈,从根节点开始入栈,只要一直存在左节点就一直入栈,不存在左节点就出栈访问节点值,然后继续遍历出栈

求两个数的最大公约数,辗转相除法与更相减损法(递归迭代)

问题:给出两个数a和b,求出他们的最大公约数(greatest common divisor). 解法一:辗转相除法,又叫欧几里得算法.两个正整数a和b(a>b),他们的最大公约数等于a除以b的余数和b之间的最大公约数. 比如10和25,25除以10余5,那么10和25的最大公约数等同于5和10之间的最大公约数. //辗转相除法 递归解法 int gcd(int a,int b){ if(a%b==0) return b; return (b,a%b); } //辗转相除法 迭代解法int gc

DNS解析原理:递归 &amp;&amp; 迭代

DNS解析流程分为递归查询和迭代查询,递归查询是以本地名称服务器为中心查询, 递归查询是默认方式,迭代查询是以DNS客户端,也就是客户机器为中心查询. 先不说那么多,看两张图你应该就明白了. 递归: 迭代: 再介绍几个概念: 本地名称服务器 又称Local DNS, 可以是默认的运营商提供的Local DNS 或者自己设置的DNS. 下图是windows下默认获取的运营商Local DNS或者 自己设置的Local DNS 权威DNS 权威 DNS 由域名解析服务商建设,提供域名管理服务,维护域

SICP:1.37 递归/迭代求无穷连分式

#lang racket (define (cont-frac N D k) (define (cf t) (if (= t 1) (/ (N t) (D t)) (/ (N t) (+ (D t) (cf (- t 1)))) );if );cf (cf k) );cont-frac (define (cont-frac-iteration N D k) (define (cf result t) (if (= t k) result (cf (/ (N t) (+ (D t) result)