Thinking in scala (8)---- 乘幂计算

递归的方式:

b^n = (b^(n/2))^2 若n是偶数

b^n = b*(b^(n-1)) 若n是奇数

迭代的方式

product:存储中间结果,初始化为1

b^n = (b^2)^(n/2) * product       若n是偶数

b^n = b^(n-1)       * product*b    若n是奇数

递归方式比较简单,这里不再贴上实现的代码,下面是用迭代方式计算乘幂的Scala代码:

object expt{
  def f(b:Int,n:Int,product:Int):Int={
    if(n==1) b*product
    else if(isOdd(n)) f(b,n-1,b*product)
    else f(b*b,n/2,product)
  }
  def isOdd(n:Int)={
    n%2 == 1
  }
  def expt(b:Int,n:Int)=f(b,n,1)
  def main(args:Array[String])=
  {
    println(expt(2,10))
    println(expt(2,11))
    println(expt(5,9))
  }
}

无论是递归算法还是迭代算法,时间复杂度都是O(lg(n)),递归算法的空间复杂度是O(lg(n)),迭代算法的空间复杂度是O(1)

时间: 2024-10-11 23:44:38

Thinking in scala (8)---- 乘幂计算的相关文章

Scala程序集 牛顿法计算平方根

牛顿法是一个迭代算法,原理用一句话就可以概括:如果 a * b = n,那么 n的平方根一定在a与b之间 换句话说 (a + b) /2 ,一定比a更精确 package puzzles.sqrt /**  * Created by Bo on 2015/1/1.  */ import scala.math.abs object Newton extends  App{   def sqrt(num: Double): Double = {     def iter(guess: Double)

[原创]Scala学习:关于变量(val,var,类型推断)

1.常量定义:  val val 类似于java中的final变量.一旦初始化了,val就不能再被赋值 val megs = "hello world" 2.变量的定义: var var 如同java里面的非final变量,可以在它的声明周期内多次被赋值 var spark:String = " i am big data " var spark: String = " i am" 解释器中支持table键 补充和提示 3.变量类型推断: 当分配

大数据系列修炼-Scala课程10

今天主要是关于Scala中对List的相关操作,list在Scala中应该是至关重要,接下来会讲解关于List的一系列操作 List的map.flatMap.foreach.filter操作讲解 1.关于List的Map.flatMap操作.区别 2.对List的foreach.filter操作 //list中的Map中用一个函数表达式-->实则是对list进行操作,_可以表示一个函数或者表达式 List(1, 2, 3, 4, 6) map (_ + 1) //> res0: List[In

Scala类型声明与定义、函数定义、流程控制、异常处理

Scala源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库. Scala的基础类型基本与javascript一致. Scala的数据类型全部相同于Java中,具有相同的内存占用和精度.以下表是有关可在Scala中所有的数据类型的细节: 数据类型 描述 Byte 8位有符号值.范围从-128到127 Short 16位有符号值.范围从-32768至32767 Int 32 位有符号值.范围从 -2147483648 to 2147483647 Long 64位

新一代大数据计算引擎 Flink从入门到实战

Flink第一章 [录播]01.体验flink-安装配置-启动(16分钟) 免费试学 [录播]02.启动flink-scala-shell读取文件实现打印(10分钟) [录播]03.使用flink scala shell实现word count(16分钟) [录播]04.使用静态数据模拟流操作fromElements(3分钟) [录播]05.运行word count套接字流计算程序(11分钟) 02 Flink第二章 [录播]06.idea flink api编程(8分钟) [录播]07.git

大数据框架对比:Hadoop、Storm、Samza、Spark和Flink--容错机制(ACK,RDD,基于log和状态快照),消息处理at least once,exactly once两个是关键

分布式流处理是对无边界数据集进行连续不断的处理.聚合和分析.它跟MapReduce一样是一种通用计算,但我们期望延迟在毫秒或者秒级别.这类系统一般采用有向无环图(DAG). DAG是任务链的图形化表示,我们用它来描述流处理作业的拓扑.如下图,数据从sources流经处理任务链到sinks.单机可以运行DAG,但本篇文章主要聚焦在多台机器上运行DAG的情况. 关注点 当选择不同的流处理系统时,有以下几点需要注意的: 运行时和编程模型:平台框架提供的编程模型决定了许多特色功能,编程模型要足够处理各种

Spark入门实战系列--1.Spark及其生态圈简介

[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架.Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处,Spark以其先进的设计理念,迅速成为社区的热门项目,围绕着Spark推出了Spark SQL.Spark St

SICP-求幂

[问题] 对一个给定的数计算乘幂问题. [思路1] 对一个基数b和一个正整数的指数n,计算出b^n的过程.可以通过下面的这个递归定义: b^n = b * b ^(n-1) b^0 = 1 直接翻译为如下过程: (define (expt b n) (if (= n 0) 1 (* b (expt b (- n 1))))) 这是一个线性的递归计算过程,需要THETA(n)步和THETA(n)空间.我们可以很容易将其形式化为一个等价的线性迭代: (define (expt b n) (expt-

大数据基础

1.Bloom Filter 过滤器数据分片与路由 分区算法:一致性哈希算法 2.备份机制与一致性 3.CAP理论 4.幂等性:分布式系统状态管理基石 5.一致性模型:强.弱.最终一致. 6.备份机制:法7,Leader-Follower模式 7.共识协议:一致性协议.Paxos或者Raft 8.算法与数据结构 9.LSM:学习和B+树的区别和优势 10.压缩算法:主流压缩算法Snapppy,LZ4. 11.Bloom Filter过滤器 统计学 1.集中趋势 2.变异性 3.归一化 4.正态分