斐波那契算法的对数解法 计算机程序的构造和解释 习题1.19

程序由Scheme语言编写,待会上别的语言实现。

#lang racket
;斐波那契对数法
;筛选
(define (fib n)
  (fib-iter 1 0 0 1 n))

(define (square x)
  (* x x))

(define (fib-iter a b p q count)
  (cond ((= count 0) b);count = 0时,fib(1) = 0
        ((even? count);如果是偶数,那么,p,q的值分别为
         ;p = p^2 + q^2
         ;q = 2pq + q^2
         ;count的数值减半
        (fib-iter a
                  b
                  (+ (square p) (square q))
                  (+ (* 2 p q) (square q))
                  (/ count 2)))
        ;如果不是,即奇数,那么通过降一次幂进入下一步运算
  (else (fib-iter (+ (* b q) (* a q) (* a p))
             (+ (* b q) (* a q))
             p
             q
             (- count 1)))))
时间: 2024-08-07 05:45:28

斐波那契算法的对数解法 计算机程序的构造和解释 习题1.19的相关文章

算法笔记_001:斐波那契数的多种解法

本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第几个斐波那契数.(Java: 231-1 for int, 263-1 for long) 解决方案:针对问题1,此处要使用迭代法来解决,具体实现代码如下: //用迭代法寻找编程环境支持的最大整数(int型)的斐波那契数是第几个斐波那契数 public static int max_int_iter

斐波那契高效算法(4种算法综合分析)

斐波那契数列问题是算法学习者必定接触到的问题.作为经典问题,首次接触时通常是作为递归算法的案例教程. 然而递归解决斐波那契.其效率低的令人发指,有人算出其时间复杂度为O(2^n).指数级时间复杂度. 假设面试的时候面试官问你斐波那契的求解方法,你来一个递归求解,基本上能够说,你已经game over了. 那么有没有更高效的算法呢.本文将一一介绍. 以下是斐波那契的4种解法: 1.递归    时间复杂度O(2^n) int f(int n){ if(n == 1 || n == 2){ retur

斐波那契数列算法优化

做一道斐波那契算法问题,结果运行超时 public class Solution { public int Fibonacci(int n) { if(n == 0){ return 0; } if(n == 1){ return 1; } return Fibonacci(n - 1) + Fibonacci(n - 2); } } 找到了一篇文章,http://blog.csdn.net/sloder/article/details/8624373 按照其提供的思路: 保存计算项之前的每一项

用安卓实现斐波那契数和最近点对问题

目录 1 运行效果展示 2 具体编码 2.1 斐波那契数问题 2.2 最近点对问题 1 运行效果展示 2 具体编码 2.1 斐波那契数问题 具体问题即解决方案请参考本人另一篇博客:算法笔记_001:斐波那契数的多种解法 功能界面布局main_one.xml文件对应界面图: 其源码: <?xml version="1.0" encoding="utf-8" ?> <GridLayout xmlns:android="http://schem

斐波那契数列问题的两种解决方法

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........ 这个数列从第3项开始,每一项都等于前两项之和. 简单来说,斐波那契数列可以用下面这个公式来表示. { 0 ,n=0 f(n)={ 1 ,n=1 { f(n-1)+f(n-2) ,n>1 关于斐波那契数列衍生的算法题层出不穷,比如青蛙跳台阶问题等(

斐波那契数列的三种时间复杂度

/*前边两个为一种做法*/ /*后边有另外的做法(差分方程以及利用矩阵去做)*/ //***************************************************//***************************************************//*************************************************** 第一种做法 这是2018王道数据结构考研复习指导的第一章思维拓展的题目. 关于斐波那契数列的简介:

[从今天开始修炼数据结构]栈、斐波那契数列、逆波兰四则运算的实现

一.栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表.允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom).栈又称后进先出的线性表,简称LIFO结构. 注意:首先它是一个线性表,也就是说栈元素有前驱后继关系. 栈的插入操作,叫做进栈,也称压栈.入栈 栈的删除操作,叫做出栈,也叫弹栈. 注意:最先入栈,不代表就要最后出栈.因为栈没有限制出栈的时间,例如可以先入栈两个元素,再出栈两个元素,后入栈其他元素. 二.栈的抽象数据类型 ADT Stack Data 同线性表.元素具有相

编程之美2.9 斐波那契数列

斐波那契数列是我们在学习C语言的时候.在递归那一章的经典实例.当然,还会有汉诺塔的样例. 这个问题时这样定义的: 0 (x <= 0) f(x)   =  1 (x == 1) f(x - 1) + f(x - 2) (x > 1) 看到这个递推公式后.我们非常easy能够写出例如以下的代码: 函数声明: typedef long long ll; ll DutFibonacci_1(int); 函数定义: /*经典的斐波那契数列的递归解法,并且每一个人都知道这样的方法效率非常低*/ ll D

看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)

查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表分类:静态查找表和动态查找表. 静态查找表:只查找,而不进行插入,删除. 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素. 静态表的 查找 大致 四种 算法: 线性查找,二分查找,斐波那契查找和插值查找. 其中 在线性查找之前,对表 无要求.对于 其余三种 需要 在查找之前 排序.插值查找 除了 需要 排序,还需要 均匀分布. 下面 给出代码: 线性查