开发者学堂课程【Scala 核心编程 - 进阶:递归翻转字符串和求阶乘】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9100
递归翻转字符串和功能
内容介绍:
一、使用函数式编程方式-递归翻转字符串
二、使用函数式编程方式-递归求出阶乘
回顾:
调用方法上节课有点小问题,这里 max 就直接系统自动写方法了,其实这里想讲自己写,最好取一个名字不一样,叫 mymax ,下面都得变化一下,写 mymax 把例子放进去,再试19,0,89,-100。应该返回89就对了,运行发现返回值为89,代码没有问题的,但我们用的是递归的方式来解决的。
package com.atguigu.chapter14
object RecursiveMaxlist {
def main(args: Array[string]):Unit = {
println(myMax(List(1,1,19,-1,0,89,-100))) // 89
}
//使用递归求 List 中的最大元素
def myMax(xs: List[Int]): Int = {
//如果为empty,推出异常
if(xs.isEmpty)
throw new java.util.NosuchElementException
if(xs.size == 1)// 如果有一个元素,就是它
xs.head
//递归时告诉计算机做什么,而不是告诉计算机怎么做(选代)
else if (xs.head > mvMax(xs.tail)) xs.head else myMax(xs.tail)
}
}
一.使用函数式编程方式-递归翻转字符串
用递归翻转字符串的案例,以前写字符串的翻转,是找到中间值,用 for 循环,而这里递归显得非常的简洁高效,很优雅,接收一个字串,如果这个长度等于1,则返回它,否则把这个尾部写到前面,把头部写到后面,很简洁。
//Str = "ab"
defreverse(xs: String): String =
if (xs.length == 1) xs else reverse(xs.tail) + xs.head
举例:
RecursiveRiverseString ,如果做开发面试时候,用递归来完成,面试官会觉得很特别,因为一般是把 for 循环拆解成一个字符串,然后找到中间,然后颠倒,很少看到递归来完成。
下例是使用递归完成对字符串的翻转,是如何翻转的,把这个代码稍加整理,看的更清晰,即计算机做即可,怎么做不重要。
如果长度为1,那就是自己,只有一个直接返回就可以,一个不存在反转。怎么翻转还是自己。
下面一旦翻转,将尾部进行翻转,将尾提到前面,将头放到后面,即长度>1 ,则执行将尾部拎到后面,递归在不停的拆,头在前面。这个执行速度没有任何影响,明显感觉到不是指令性质的,即不类似之前写的,第一步怎么做,第二步怎么做?
实际运行如这里一个字符串 val str = " hello ”,reverse 直接将尺寸放入,最结果被翻转过来应该是 o lleh ,和预想一样,非常简洁。这是递归的方式来完成的。
package com.atguigu.chapter14
object RecursiveReversestring {
def main(args: Array[string]): Unit ={
val str = "Hello"
println(reverse(str)) // olleh
}
//使用递归完成对字符串的翻转
def reverse(xs: string):string =
if(xs.length == 1) //如果长度为1,就返回
xs
else
reverse(xs.tail)+ xs.head // 如果长度>1,就是执行这就话
}
二.使用函数式编程方式-递归求出阶乘
求阶层是1×2×3×4×5,阶层也很简单,用递归,如果n=0就是1,否则就是n ×( n-1 ),至于里面怎么计算,不重要,也非常简单。
def factorial(n: Int): Int =
if (n == 0) 1 else n * factorial(n – 1)
运行一下,求阶层,走一段代码 RecursiveFactoria ,用递归的方式求阶层,运行即可,写了一个函数求阶乘,如求10的阶层,则1×2×…n,运行这个结果没有错。再测一个小的,看是否正确,如果乘到三,1×2×3应该为6,则正确。
package com.atguigu.chapter14
object RecursiveFactoria {
def main(args: Array[String]): Unit = {
println(factorial(3)) // 1*2*...10 =
}
//求出阶乘
def factorial(n: Int):Int =
if (n == 0) 1 else n * factorial(n - 1)
}
这是我们取得函数式编程的又一个阶乘的求法,案例举过后要强调,递归虽然很好,也很优雅,但是使用是有陷阱的,先抛砖引玉的讲了递归来完成一些功能或任务。