递归翻转字符串和求阶乘 | 学习笔记

简介: 快速学习递归翻转字符串和求阶乘

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

}

这是我们取得函数式编程的又一个阶乘的求法,案例举过后要强调,递归虽然很好,也很优雅,但是使用是有陷阱的,先抛砖引玉的讲了递归来完成一些功能或任务。

相关文章
|
6月前
|
机器学习/深度学习 C语言
函数递归与迭代附n的阶乘+顺序打印一个整数的每一位数+求第n个斐波那契数
函数递归与迭代附n的阶乘+顺序打印一个整数的每一位数+求第n个斐波那契数
53 0
|
3月前
|
存储 算法 Java
|
5月前
|
存储 算法 数据可视化
深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)
深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)
|
5月前
|
存储 算法 数据可视化
|
6月前
题目----递归和非递归分别实现求n的阶乘(不考虑溢出的问题)
题目----递归和非递归分别实现求n的阶乘(不考虑溢出的问题)
27 1
|
6月前
|
算法 测试技术 C#
【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值
【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值
|
C语言
LeetCode二维数组例题(原地旋转和对角线遍历)-c语言
LeetCode二维数组例题(原地旋转和对角线遍历)-c语言
127 0
字符串的逆序(循环和递归两种解法)
字符串的逆序(循环和递归两种解法)
166 0
|
存储 Java C++
力扣题目-两数相加(迭代递归,常用3种语言实现)
力扣题目-两数相加(迭代递归,常用3种语言实现)
116 0