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

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

开发者学堂课程【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)

}

相关文章
|
4月前
|
算法 测试技术 C#
C++ 算法:区间和的个数
C++ 算法:区间和的个数
|
4月前
|
算法 测试技术 C#
C++二分算法的应用:乘法表中第k小的数
C++二分算法的应用:乘法表中第k小的数
|
7月前
P1125 [NOIP2008 提高组] 笨小猴(质数判断和快速排序找字符串最大值,最小值)
P1125 [NOIP2008 提高组] 笨小猴(质数判断和快速排序找字符串最大值,最小值)
32 0
|
10月前
二分 :数的范围
二分 :数的范围
38 0
【递归】递归求n个数中的最大值
【递归】递归求n个数中的最大值
66 0
【递归】递归求n个数中的最大值
使用二分法解决旋转数组的最小数字的问题
使用二分法解决旋转数组的最小数字的问题
67 0
使用二分法解决旋转数组的最小数字的问题
|
机器学习/深度学习
数的范围———— 二分
给定一个按照升序排列的长度为 nn 的整数数组,以及 qq 个查询。 对于每个查询,返回一个元素 kk 的起始位置和终止位置(位置从 00 开始计数)。 如果数组中不存在该元素,则返回 -1 -1。
101 0
|
存储 C++
区间问题(贪心)(二)
AcWing 906. 区间分组
64 0
区间问题(贪心)(二)
|
算法
区间问题(贪心)(一)
复习acwing算法基础课的内容,本篇为讲解基础算法:贪心——区间选点,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
110 0
区间问题(贪心)(一)
|
人工智能 索引
数组区间问题(动态规划)
数组区间问题(动态规划)