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

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

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

}

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

相关文章
|
3天前
|
数据采集 人工智能 安全
|
12天前
|
云安全 监控 安全
|
4天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1074 151
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1745 9
|
9天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
689 152
|
11天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
656 12
|
6天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
420 4