【算法数据结构Java实现】递归的简单剖析及时间复杂度计算

1.理解

            对于递归函数的理解,我觉得是比较重要的,因为很多大神能把递归函数用的惟妙惟肖,不光是他们的编程功力高深,更主要是能理解这个算法。比较直白的理解是,如果一个事件的逻辑可以表示成,f(x)=nf(x-1)+o(x)形式,那么就可以用递归的思路来实现。

编写递归逻辑的时候要知道如下法则:

1.要有基准

  比如说,f(x)=f(x-1)+1,如果不加入基准,f(0)的值是多少,那么函数会无限执行下去,没有意义

2.不断推进

  也就是f(x)=f(x-1)或是f(x)=f(x/n)之类的

          

           

 当然每个递归函数会有一个比较神奇的步骤,就是回溯步骤,比方说:

    

  fact(3) ----- fact(2) ----- fact(1) ------ fact(2) -----fact(3) 

    ------------------------------>  ------------------------------> 
                递归                            回溯 

2.实例实现

      求 的计算和f(x)=0,首先列出公式f(x)=f(x-1)+x/(4**x)     (两个**表示次方,python用惯了),得到下面的代码

public class Recursion {
     public static void main(String args[]){

    	  System.out.print(f(2));
  	 }
	   public static double f(int x){
		   if (x==0){
			   return 0;
		   }
		   else{
			   return f(x-1)+x/Math.pow(4,x);
		   }
	   }
}

结果是:f(2)=0.375,验证正确

3.时间复杂度计算

        以上题为例,将f(x)=f(x-1)+x/(4**x)展开,

将f(x)乘以4相减,得,设4的x方等于k,则原式时间复杂度,log以4为底。

参考:http://blog.csdn.net/budapest/article/details/6367973

/********************************

* 本文来自博客  “李博Garvin“

* 转载请标明出处:http://blog.csdn.net/buptgshengod

******************************************/

时间: 2024-09-23 14:16:37

【算法数据结构Java实现】递归的简单剖析及时间复杂度计算的相关文章

【算法数据结构Java实现】Java实现单链表

1.背景           单链表是最基本的数据结构,仔细看了很久终于搞明白了,差不每个部分,每个链都是node的一个对象.需要两个参数定位:一个是index,表示对象的方位.另一个是node的对象. 2.代码 node类 public class Node { protected Node next; protected int data; public Node(int data){ this.data=data; } public void display(){ System.out.p

【算法数据结构Java实现】时间复杂度为O(n)的最大和序列

1.背景              最大序列和问题一直以来是一个比较经典的算法题,看到这个问题,有很多解题的办法.今天看到了一种时间复杂度只为O(n)的解题算法,在这里记录下.              思路很简单,比方说有P1,P2,P3,P4.....这样一个序列,我们从P1开始求和,比如说在P5时求和数小于零,就可以断定.第一种情况,最大序列在P1~P5之间,或者说在P6~Pn之间.因为如果P1+P2+......+P5的和小于零,那么它可以看成一个数,而且是序列第一个数,则任何一个最大序

【算法数据结构Java实现】Java实现动态规划(背包问题)

1.背景      追随着buptwusuopu大神的脚步,最近在研习动态规划.动态规划应该叫一种解决问题的思想,记得又一次去某公司面试就被问到了这个.        多于动态规划的理解,大致是这样的,从空集合开始,每增加一个元素就求它的最优解,直到所有元素加进来,就得到了总的最优解.             比较典型的应用就是背包问题,有一个重量一定的包,有若干件物品,他们各自有不同的重量和价值,怎样背才能取得最大价值.        错误的理解:去价值/重量比最大的物品多装(之前我也是这么想

【算法数据结构Java实现】欧几里得算法

1.背景            欧几里得算法是一个求最大因子的快速算法.如果m,n存在最大因子k,假设m=x*n+r,那么m和n可以整出k的话,r也肯定可以整除k            因为定理:如果M>N,则M mod N<M/2 ,说明时间复杂度是O(log(n)) 2.代码            package Algorithm_analysis; public class Euclid { public static void main(String[] args){ int m=6

Java之递归求和的两种简单方法(推荐)_java

方法一: package com.smbea.demo; public class Student { private int sum = 0; /** * 递归求和 * @param num */ public void sum(int num) { this.sum += num--; if(0 < num){ sum(num); } else { System.out.println("sum = " + sum); } } } 方法二: package com.smbea

求Java List 递归 算法

问题描述 求Java List 递归 算法:通过方法取得的List(myList)结构如下:id name parentId1 AA null2 BB 13 CC 14 DD 25 EE 26 FF 4想要一个递归方法,以myList为参数,最后返回一个List,能够遍历出如下树的结构:AA--BB----DD------FF----EE--CCFormBean:String id;String name;String parentId; 问题补充:实际上,我要的树的结构是要在部门名的下拉列表中

算法 递归 数据结构-算法数据结构关于查找比较的小问题。通过“比较”找n个整数中最大

问题描述 算法数据结构关于查找比较的小问题.通过"比较"找n个整数中最大 通过"比较"找n个整数中最大数时,算法至少要做_次. A.log n B.nlog n C.n-1 D.n 解决方案 答案应该是C.每个值比较一次即可.

算法 数据结构 java-以下java的最短路径算法应该如何实现

问题描述 以下java的最短路径算法应该如何实现 不知道怎么用额. 解决方案 http://blog.csdn.net/javaman_chen/article/details/8254309 解决方案二: http://download.csdn.net/detail/gareth_liao/5100648 解决方案三: 谢谢回复 解决方案四: 最短路径算法(java实现)

Java集合---HashMap源码剖析

Java集合---HashMap源码剖析   一.HashMap概述二.HashMap的数据结构三.HashMap源码分析     1.关键属性     2.构造方法     3.存储数据     4.调整大小      5.数据读取                       6.HashMap的性能参数                       7.Fail-Fast机制   一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用