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

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

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

}

相关文章
|
6月前
|
算法 测试技术 C++
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
|
11月前
|
算法 测试技术 C#
C++二分算法的应用:乘法表中第k小的数
C++二分算法的应用:乘法表中第k小的数
|
11月前
|
算法 测试技术 C#
C++ 算法:区间和的个数
C++ 算法:区间和的个数
P1125 [NOIP2008 提高组] 笨小猴(质数判断和快速排序找字符串最大值,最小值)
P1125 [NOIP2008 提高组] 笨小猴(质数判断和快速排序找字符串最大值,最小值)
61 0
c/c++求两个数的最大公约数(递归版)
c/c++求两个数的最大公约数(递归版)
185 0
二分 :数的范围
二分 :数的范围
64 0
LeetCode 1877. 数组中最大数对和的最小值
一个数对 (a,b) 的 数对和 等于 a + b 。最大数对和 是一个数对数组中最大的 数对和 。
114 0
【递归】递归求n个数中的最大值
【递归】递归求n个数中的最大值
100 0
【递归】递归求n个数中的最大值
|
算法 C++
经典算法详解(11)递归查找数组中的最大值
题目:编写一个程序,用递归的方法实现查找数组中的最大值。 C++实现 1 #include 2 3 using namespace std; 4 //第一种方法是常规方法,不是使用递归,首先将第一个元素的值赋值给max,然后遍历数组, 5 //当遇到超高max的值时将其赋值给max,最...
1877 0
|
机器学习/深度学习
数的范围———— 二分
给定一个按照升序排列的长度为 nn 的整数数组,以及 qq 个查询。 对于每个查询,返回一个元素 kk 的起始位置和终止位置(位置从 00 开始计数)。 如果数组中不存在该元素,则返回 -1 -1。
120 0