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