递归算法及优化

 1 package interview;
 2 //有一个斐波那契数列计算的函数,最前面的k个数为1,后面的没一位是前k位之和,例如k=4,该函数
 3 //该函数返回值为1,1,1,1,4,7,13,25,49
 4 public class RecursiveOptimize {
 5     static int  fib_k(int n,int k) {
 6          if(n<k)
 7             return 1;
 8          int result = 0;
 9          for(int i=0;i<k;i++){
10              result += fib_k(n-i-1,k);
11          }
12          return result;
13     }
14     static int fib_k_optimize(int n,int k) {
15         if(n<k)
16             return 1;
17         int[] fib = new int[n+1];
18         for(int i=0;i<k;i++){
19             fib[i]=1;
20         }
21         for(int i=k;i<=n;i++) {
22             int result = 0;
23             for(int j=0;j<k;j++){
24                 result += fib[i-j-1];
25             }
26             fib[i]=result;
27         }
28         return fib[n];
29     }
30     public static void main(String[] args) {
31         long start = System.nanoTime();
32         for(int i=0;i<20;i++){
33             System.out.print(fib_k(i,4)+" ");
34         }
35         long end = System.nanoTime();
36         System.out.println("\n"+(end-start));
37
38         //===================================
39         start = System.nanoTime();
40         for(int i=0;i<20;i++){
41             System.out.print(fib_k_optimize(i,4)+" ");
42         }
43         end = System.nanoTime();
44         System.out.println("\n"+(end-start));
45     }
46
47 }
时间: 2024-10-10 13:52:54

递归算法及优化的相关文章

JVM原生不支持尾递归优化,但是Scala编译器支持

The JVM doesn't support TCO natively, so tail recursive methods will need to rely on the Scala compiler performing the optimization.----------"Scala in Depth" 3.5.2 Jvm本身是不支持尾递归优化得,需要编译器支持,而Java编译器不支持,但是Scala支持.写一个简单的计算1到n的和的递归算法验证一下. public cla

递归算法——求取斐波那契数列(2)

import java.util.Scanner; /** * Created by Administrator on 14-5-13. * 改进的计算斐波那契数列的方法,利用参数,经过测试运行时间会成倍减少 测试数据n=40 * 尾递归的本质是:将单次计算的结果缓存起来,传递给下次调用,相当于自动累积. * 尾部递归是一种编程技巧.递归函数是指一些会在函数内调用自己的函数, * 如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归. * 尾部递归的函数有助将算法转化成函数编程语言,

[转]递归算法详解

计算机科学的新学生通常难以理解递归程序设计的概念.递归思想之所以困难,原因在于它非常像是循环推理(circular reasoning).它也不是一个直观的过程:当我们指挥别人做事的时候,我们极少会递归地指挥他们. Introduction 递归算法是一种直接或者间接调用自身函数或者方法的算法.递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解.递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解.递归算法,其实说白了,就是程序的自身调用.它表现在一段程

javascript性能优化总结

js加载顺序优化 原理:在使用src 属性加载JavaScript 的过程中浏览器必须首先下载外部文件的代码,这要占用一些时间,然后,解析并运行此代码.此过程中,页面解析和用户交互是被完全阻塞的. 解决方案: --将所有<script>标签放置在页面的底部,紧靠body 关闭标签</body>的上方. --将脚本成组打包.页面的<script>标签越少,页面的加载速度就越快,响应也更加迅速. --为<script>标签添加defer 属性(只适用于Inter

【Scala】尾递归优化

以递归方式思考 递归通过灵巧的函数定义,告诉计算机做什么.在函数式编程中,随处可见递归思想的运用.下面给出几个递归函数的例子: object RecursiveExample extends App{ // 数列求和例子 def sum(xs: List[Int]): Int = if (xs.isEmpty) 1 else xs.head + sum(xs.tail) // 求最大值例子 def max(xs: List[Int]): Int = if (xs.isEmpty) throw n

[Java 8] Lambda表达式对递归的优化 - 使用尾递归

递归优化 很多算法都依赖于递归,典型的比如分治法(Divide-and-Conquer).但是普通的递归算法在处理规模较大的问题时,常常会出现StackOverflowError.处理这个问题,我们可以使用一种叫做尾调用(Tail-Call Optimization)的技术来对递归进行优化.同时,还可以通过暂存子问题的结果来避免对子问题的重复求解,这个优化方法叫做备忘录(Memoization). 本文首先对尾递归进行介绍,下一票文章中会对备忘录模式进行介绍. 使用尾调用优化 当递归算法应用于大

(转)优化js脚本设计,防止浏览器假死

在Web开发的时候经常会遇到浏览器不响应事件进入假死状态,甚至弹出“脚本运行时间过长“的提示框,如果出现这种情况说明你的脚本已经失控了,必须进行优化. 为什么会出现这种情况呢,我们先来看一下浏览器的内核处理方式: 浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现三个常驻线程:javascript引擎线程,GUI渲染线程,浏览器事件触发线程. JavaScript引擎是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来然后加以处理,浏览器无论再什么时候都

优化js脚本设计,防止浏览器假死

在Web开发的时候经常会遇到浏览器不响应事件进入假死状态,甚至弹出"脚本运行时间过长"的提示框,如果出现这种情况说明你的脚本已经失控了,必须进行优化. 为什么会出现这种情况呢,我们先来看一下浏览器的内核处理方式: 浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现三个常驻线程:javascript引擎线程,GUI渲染线程,浏览器事件触发线程. JavaScript引擎是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来然后加以处理,浏览器无论再

[Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .

递归优化 很多算法都依赖于递归,典型的比如分治法(Divide-and-Conquer).但是普通的递归算法在处理规模较大的问题时,常常会出现StackOverflowError.处理这个问题,我们可以使用一种叫做尾调用(Tail-Call Optimization)的技术来对递归进行优化.同时,还可以通过暂存子问题的结果来避免对子问题的重复求解,这个优化方法叫做备忘录(Memoization). 本文首先对尾递归进行介绍,下一票文章中会对备忘录模式进行介绍. 使用尾调用优化 当递归算法应用于大