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

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

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

}

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

相关文章
|
16天前
|
算法 测试技术 C#
【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值
【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值
|
10月前
字符串的逆序(循环和递归两种解法)
字符串的逆序(循环和递归两种解法)
89 0
|
11月前
|
存储 Java C++
力扣题目-两数相加(迭代递归,常用3种语言实现)
力扣题目-两数相加(迭代递归,常用3种语言实现)
|
11月前
|
算法 程序员 C语言
C语言基础(有关三个数比较大小、冒泡排序、最大公约数、和有关某个数x的绝对值的n次方除于n的阶乘问题的函数求解法;和阶乘函数递归方法;和数组作函数参数的
C语言基础(有关三个数比较大小、冒泡排序、最大公约数、和有关某个数x的绝对值的n次方除于n的阶乘问题的函数求解法;和阶乘函数递归方法;和数组作函数参数的
|
存储
【C】逆序字符串(俩种递归思路)
【C】逆序字符串(俩种递归思路)
63 0
【C】逆序字符串(俩种递归思路)
【递归与递推 1】AcWing94.递归实现排列型枚举
【递归与递推 1】AcWing94.递归实现排列型枚举
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
76 0
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
复习C部分:1.看代码求值题 2.写三个整数代码从大到小输出 3.打印1~100中所有3的倍数 4.给定两个数,求最大公约数(递减法,辗转相除法)
复习C部分:1.看代码求值题 2.写三个整数代码从大到小输出 3.打印1~100中所有3的倍数 4.给定两个数,求最大公约数(递减法,辗转相除法)
100 0
复习C部分:1.看代码求值题 2.写三个整数代码从大到小输出 3.打印1~100中所有3的倍数 4.给定两个数,求最大公约数(递减法,辗转相除法)
108.递归整数四则运算
108.递归整数四则运算
60 0