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

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

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

}

相关文章
|
算法
【算法专题突破】双指针 - 有效三角形的个数(5)
【算法专题突破】双指针 - 有效三角形的个数(5)
39 0
|
5月前
|
算法 测试技术
【算法】二分算法——寻找旋转排序数组中的最小值
【算法】二分算法——寻找旋转排序数组中的最小值
|
8月前
|
机器学习/深度学习 算法 测试技术
【单调栈】3113. 边界元素是最大值的子数组数目
【单调栈】3113. 边界元素是最大值的子数组数目
|
8月前
|
机器学习/深度学习 算法 测试技术
【线段树】【区间更新】2916. 子数组不同元素数目的平方和 II
【线段树】【区间更新】2916. 子数组不同元素数目的平方和 II
【线段树】【区间更新】2916. 子数组不同元素数目的平方和 II
|
8月前
|
算法 测试技术 C#
二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目
二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目
|
算法 测试技术 C#
C++ 算法:区间和的个数
C++ 算法:区间和的个数
出栈序列个数问题——用一个公式去解
出栈序列个数问题——用一个公式去解
382 0
出栈序列个数问题——用一个公式去解
|
自然语言处理 算法 Python
利用函数求出一个数组最大三个数的乘积
利用函数求出一个数组最大三个数的乘积
126 0
|
人工智能 算法
刷题之寻找 3 个数的最大乘积和拼数及四平方和
刷题之寻找 3 个数的最大乘积和拼数及四平方和
144 0
【递归】递归求n个数中的最大值
【递归】递归求n个数中的最大值
121 0
【递归】递归求n个数中的最大值

热门文章

最新文章