使用递归求出最大值 | 学习笔记

简介: 快速学习使用递归求出最大值

开发者学堂课程【Scala 核心编程 - 进阶使用递归求出最大值学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9099


使用递归求出最大值


使用函数式编程方式递归

求最大值,案例演示:

递归几个案例,递归是直接告诉计算机做什么,而不是告诉计算机怎么做。

如求最大值,若自己用递归写,如下代码,写了一个 max ,传入一个 list ,要取 list 中的最大值怎么写,如下列代码,如果 list 等于空。即一个数都没有,则抛出一个异常。若传入的 list 只有一个,则直接将头返回。

另一种情况为头大于后面所有尾部的数则可能知道将头返回,否则继续执行。运行代码称为递归求最大值, Recursive 求 list 最大值,若自己写,能否写出改代码?

代码没有问题,此处递归使用了求 list 中的最大元素。思路较简单,若为空,则抛出异常。

若有一个元素,就是它。另一种情况为 else 若头大于尾部,进行比较,判断是否大于要递归向里走,大于则为头,否则为尾。不断递归,将头不断拆解。从代码上很优雅,理解上不是很好理解。

因为递归进入后计算机帮做,因此递归是告诉计算机做什么,而不是计算机怎么做。因为怎么做一般为迭代来做,一般为第一步怎么做?第二步怎么做?第三步怎么做?而这里只考虑头是否大于后面,若大于则返回,否则继续向后推。

//大话 java 数据结构

def max(xs: List[Int]): Int = {

if (xs.isEmpty)

throw new java.util.NoSuchElementException

if (xs.size == 1)

xs.head

else if (xs.head > max(xs.tail)) xs.head else max(xs.tail)

}

下面运行代码如写了 list 1就一个元素,则写 max 。则返回为1。若再加-1,9两个元素,返回则为9。若要求自己写list最大值。普通方法为先便利,发现指针最大后返回,该方法较繁琐。这里较简洁,但不好理解,这是第二个案例即求最大值。

package com.atguigu.chapter14

object RecursiveMaxList {

def main ( args: Array [ String ]) : Unit ={

println ( List (1,-1,9). Max )

}

//使用递归求List中的最大元素

def max ( xs: List [ Int ]): Int = {

//如果为empty,抛出异常

If ( xs.isEmpty )

throw new java.util.NosuchElementException if(xs.size==1)// 如果有一个元素,就是它

xs.head

//递归时告诉计算机做什么,而不是告诉计算机怎么做(选代)

else if (xs.head > max(xs.tail)) xs.head else max(xs.tail)

}

}

体会了递归的优雅性,但理解有难度。第二个小案例,用函数解决问题。求最大值的递归方式,

代码如下:

if(xs.size==1)// 如果有一个元素,就是它

xs.head

// 递归时告诉计算机做什么,而不是告诉计算机怎么做(迭代)

else if (xs.head> max(xs.tail)) xs.head else max(xs.tail)

}

相关文章
|
Unix Linux iOS开发
振南技术干货集:各大平台串口调试软件大赏(4)
振南技术干货集:各大平台串口调试软件大赏(4)
|
开发者 Python
【python圣诞树的实现】
【python圣诞树的实现】
327 0
|
机器学习/深度学习 人工智能 边缘计算
人工智能语音转文字(Automatic Speech Recognition, ASR)
人工智能语音转文字(Automatic Speech Recognition, ASR)
883 1
|
存储 SQL 算法
Mysql进阶索引篇02——InnoDB存储引擎的数据存储结构(一)
前面我们已经剖析了mysql中InnoDB与MyISAM索引的数据结构,了解了B+树的设计思想、原理,并且介绍了B+树与Hash结构、平衡二叉树、AVL树、B树等的区别和实际应用场景。 页和页之间并不一定在物理上相连,只是在逻辑上使用双向链表关联。指针、记录究竟是如何存储的呢?其实这就需要联系我们之前提到的行格式了。数据查找在页目录中二分法快速定位到槽,上面的过程都与页的内部结构相关,本文将详细的阐述。
Mysql进阶索引篇02——InnoDB存储引擎的数据存储结构(一)
|
算法 安全 关系型数据库
Diffie-Hellman密钥交换协议
Diffie-Hellman密钥交换协议
653 6
|
Android开发 C++
so兼容32位和64位
在Android开发中遇到32位`xxx.so`动态库在64位设备上运行失败的问题,导致应用崩溃。错误提示因缺少64位版本的库。尝试创建`arm64-v8a`目录并复制库文件后,依然崩溃,因为库本身是32位。解决方案是在`build.gradle`中添加配置,指定支持的ABI滤镜,并在`gradle.properties`中设置`android.useDeprecatedNdk=true`,以解决兼容性问题。
544 7
|
数据管理 BI 定位技术
什么是数据地图、血缘分析和数据资产?
什么是数据地图、血缘分析和数据资产?
|
Kubernetes 算法 NoSQL
动态扩缩容下的全局流水号设计
该文介绍了在动态扩缩容场景下如何使用雪花算法生成全局流水号。雪花算法生成的ID由时间戳、工作机器ID和序列号组成。在K8s环境中,通过Redis存储当前workerId的最大值,每次生成时加1并取模,确保workerId在0-1023范围内。文中提供了实现雪花算法的`SnowflakeIdWorker`类示例,并展示了两种动态获取workerId的方法:一是利用Redis incr操作;二是通过Nacos服务发现获取IP和端口信息计算。此外,还提到了其他获取workId和dataCenterId的策略,如使用本地IP和主机名。
461 1
|
前端开发 Java Spring
properties配置文件的读取
properties配置文件的读取
244 0
|
测试技术
波士顿矩阵
波士顿矩阵
478 0