scala基础学习_方法函数
文章目录
- 方法与函数
- 函数(又称函数值/匿名函数)
- 定义方法
- 注意
- 单参数函数
- 多参数函数
- 函数作为参数传递
- 方法
- 将方法转换为函数
- 方法的返回值
- 总结
方法与函数
函数(又称函数值/匿名函数)
- 定义在任何地方:函数可以定义在类的成员中,也可以定义在顶层(即不在任何类或对象中这是scala3特性)。
- 不能访问类的私有成员:除非函数定义在类内部,否则它不能访问类的私有成员。
- 是一等公民:函数可以作为值传递,可以赋值给变量,可以存储在数据结构中,可以作为其他函数的参数或返回值。
- 可以使用函数字面量定义:函数可以使用
=>
符号定义匿名函数。
=>
符号在 Scala 中用于定义匿名函数,它提供了一种简洁的方式来定义函数,特别是在需要将函数作为参数传递给其他函数时。匿名函数是函数式编程的重要组成部分,使代码更加灵活和可组合。
在 Scala 中,匿名函数(也称为 lambda 表达式)通常与 val
一起使用,而不是 var
。这是因为匿名函数本身是一个值,并且你通常不希望重新赋值给这个函数。‘
定义方法
val 函数名:函数类型=>返回类型 = (实际传入参数)=>表达式
简洁形式:这种形式的匿名函数直接将参数和表达式放在 =>
符号的两侧。这种形式的函数没有函数体,因此它的返回值是 =>
右侧表达式的结果。
// 定义参数类型返回类型,定义参数,表达式
val ldsx2: (Int, Int) => Unit = (a, b) => println(a, b)
// 定义参数 参数类型,表达式
val ldsx2 = (a:Int, b:Int) => println(a, b)
带函数体形式:这种形式的匿名函数使用花括号 {}
来定义函数体。函数体中的最后一个表达式是函数的返回值。
val ldsx3: (Int, Int) => Unit = (a, b) => {println(a, b)
}
定义部分
(Int, Int) => Unit
是 Scala 中的一种函数类型表示法,它表示一个接受两个 Int
类型参数并返回 Unit
类型结果的函数。这种表示法通常用于定义匿名函数(lambda 表达式)或高阶函数。
具体来说:
(Int, Int)
: 这部分表示函数接受两个参数,这两个参数的类型都是Int
。=>
: 这个符号表示函数类型。Unit
: 这部分表示函数的返回类型。Unit
是 Scala 中的一个特殊类型,表示没有值,类似于 Java 中的void
。
因此,(Int, Int) => Unit
表示一个函数类型,这个函数接受两个 Int
类型的参数,并返回 Unit
类型的结果。这意味着这个函数执行一些操作,但不返回任何值。
以下是一个使用 (Int, Int) => Unit
函数类型的例子:
表达式部分
(a, b)
: 这部分定义了匿名函数的参数列表。这个匿名函数接受两个参数,分别是a
和b
。=>
: 这个符号表示函数字面量的开始。{ println(a, b) }
: 这部分是匿名函数的主体,它是一个代码块。这个代码块包含一个表达式println(a, b)
,这个表达式打印参数a
和b
的值。
注意
在 Scala 中,当匿名函数的主体只包含一个表达式时,花括号 {}
可以省略。同样,当匿名函数只有一个参数时,圆括号 ()
也是可选的。这些简化使得代码更简洁,但也保持了代码的可读性。
-
花括号
{}
:
花括号用于定义匿名函数的主体。当匿名函数的主体只包含一个表达式时,花括号可以省略。例如:// 使用花括号 val result1 = ary.filter( n => { n == 2 })// 不使用花括号 val result2 = ary.filter(n => n == 2)
在这两个例子中,
n => n == 2
是一个匿名函数,它接受一个参数n
并返回一个布尔值,表示n
是否等于2
。当匿名函数的主体只有一个表达式时,花括号是可选的。 -
圆括号
()
:
圆括号用于定义匿名函数的参数列表。当匿名函数只有一个参数时,圆括号也是可选的。例如:// 使用圆括号 val result3 = ary.filter((n) => n == 2)// 不使用圆括号 val result4 = ary.filter(n => n == 2)
在这两个例子中,
n => n == 2
和(n) => n == 2
都是有效的匿名函数。当匿名函数只有一个参数时,圆括号是可选的。
单参数函数
val square: Int => Int = x => x * x// 调用匿名函数
println(square(5)) // 输出 25val square = x:Int => x*x
在这个例子中,square
是一个匿名函数,它接受一个 Int
类型的参数 x
,并返回 x
的平方。
多参数函数
val add: (Int, Int) => Int = (a, b) => a + b// 调用匿名函数
println(add(3, 4)) // 输出 7
在这个例子中,add
是一个匿名函数,它接受两个 Int
类型的参数 a
和 b
,并返回它们的和。
val add: (Int, Int) => Int = (a, b) => a + b
这行代码定义了一个名为 add
的值,它实际上是一个匿名函数(也称为函数字面量)。下面是详细的语法解释:
val add
:val
是一个关键字,用于定义一个不可变的值(类似于常量)。add
是这个值的名称。
: (Int, Int) => Int
:- 这部分定义了
add
的类型。 (Int, Int)
表示这个函数接受两个Int
类型的参数。=>
符号表示函数的参数和返回值之间的映射。Int
表示这个函数返回一个Int
类型的结果。- 因此,
(Int, Int) => Int
表示这是一个接受两个Int
参数并返回Int
结果的函数类型。
- 这部分定义了
= (a, b) => a + b
:=
符号用于将右侧的匿名函数赋值给左侧的add
。(a, b)
表示匿名函数的参数列表,其中a
和b
是两个Int
类型的参数。=>
符号表示参数和函数体之间的映射。a + b
是函数体,表示将参数a
和b
相加并返回结果。
综上所述,这行代码定义了一个名为 add
的值,它是一个接受两个 Int
参数并返回它们之和的匿名函数。你可以像调用普通函数一样调用 add
:
println(add(3, 4)) // 输出 7
在这个例子中,add(3, 4)
调用了匿名函数 (a, b) => a + b
,其中 a
被赋值为 3
,b
被赋值为 4
,函数体 a + b
计算结果为 7
,并打印出来。
函数作为参数传递
匿名函数通常用作高阶函数的参数。高阶函数是可以接受函数作为参数或返回函数作为结果的函数。
object Scalafunc {def main(args:Array[String]):Unit={// 匿名函数定义val fc :(Int,Int)=>Int = (a,b) =>a+bprintln(fc(1,2))greet("ldsx")lambda_func((a,b)=>a+b,1,"3")}def greet(name: String): Unit = {println(s"Hello, $name!")}def lambda_func(func :(Int,String)=>String,a:Int,b:String):Unit={val data = func(a,b)println(data)}}
在lambda_func
中,参数分为二部分,共三个
func :(Int,String)=>String
- 第一个参数接受匿名函数名称
func
- 这个参数目是设置好匿名函数名称,确认匿名函数
func
接受的参数 与返回的数据类型
- 第一个参数接受匿名函数名称
a:Int,b:String
a,b
为func
所需的参数,但是需要通过lambda_func
传入函数内部给func
调用
方法
- 定义在类或对象中:方法定义在类或对象内部,是类或对象的一部分。
- 可以访问类的成员:方法可以访问类的私有成员(如变量和其他方法)。
- 不是一等公民:方法不能直接作为值传递,不能赋值给变量,不能存储在数据结构中,也不能作为其他方法的参数或返回值。
- 使用
def
关键字定义:方法使用def
关键字定义。
object Scalafunc {val ldsx = "hello"def main(args:Array[String]):Unit={// 匿名函数定义val fc :(Int,Int)=>Int = (a,b) =>a+bprintln(fc(1,2))greet("ldsx")// 访问成员println(ldsx)}def greet(name: String): Unit = {println(s"Hello, $name!")}}
将方法转换为函数
虽然方法不是一等公民,但你可以通过将方法转换为函数来使用它。这可以通过在方法后面加上一个下划线 _
来实现。
class MyClass {def greet(name: String): String = {s"Hello, $name!"}
}val myObject = new MyClass
val greetFunction: String => String = myObject.greet _println(greetFunction("Scala")) // 输出 "Hello, Scala!"
在这个例子中,myObject.greet _
将 greet
方法转换为了一个函数。
方法的返回值
在 Scala 中,函数和方法不需要显式地使用 return
关键字来返回值。Scala 的函数和方法会返回其最后一个表达式的结果,
def add(a: Int, b: Int): Int = {a + b // 这个表达式的结果会被返回
}
val result = add(3, 4)
println(result) // 输出 7
在 Scala 中,过程方法是一种不返回任何值的方法。过程方法的返回类型是 Unit
,你可以省略 Unit
,因为编译器可以推断出返回类型。以下是一个过程方法的示例
// 定义Unit过程方法不会有返回值
def fun3(a:String):Unit={var info_d = "aaaa"info_d
}// 设置返回值将会返回最后一个表达式 info_d
def fun4(a:String):String={var info_d = "aaaa"info_d
}// 当最后一个表达式是print 则报错,因为print
def fun4(a: String): String = {var info_d = ainfo_dprintln(info_d)}// 不定义返回值 自动编译判断,当你返回表达式有结果时为过程函数,当返回值时为返回值函数
def fun4(a: String) = {var info_d = aprintln(info_d,111)a
}
总结
- 方法 是类或对象的一部分,可以访问类的私有成员,但不是一等公民。
- 函数 可以在任何地方定义,不能直接访问类的私有成员(除非在类内部定义),但它们是一等公民,具有更大的灵活性和功能性。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
scala基础学习_方法函数
文章目录 方法与函数函数(又称函数值/匿名函数)定义方法注意 单参数函数多参数函数函数作为参数传递 方法将方法转换为函数方法的返回值总结 方法与函数 函数(又称函数值/匿名函数) 定义在任何地方:函数可以定义在类…...
![](https://i-blog.csdnimg.cn/direct/6ba7efe42b62420289a9fcc224c28161.png)
Android车机DIY开发之软件篇(八)单独编译
Android车机DIY开发之软件篇(八)单独编译 1.CarLauncher单独编译 CarLauncher源码位于 packages/apps/Car/Launcher 用Eclipse ADT 谷歌定制版编译而成,.mk .bp编译 Android13目录如下: alientekalientek:~/packages/apps/Car$ ls Calendar …...
![](https://www.ngui.cc/images/no-images.jpg)
【Bug】报错信息:Required request body is missing(包含五种详细解决方案)
大家好,我是摇光~ 遇到“Required request body is missing”错误通常意味着服务器期望在HTTP请求中包含一个请求体(body),但是实际上并没有收到。 例如: 当你在使用网页或应用程序的后台(比如一个网站或手…...
![](https://www.ngui.cc/images/no-images.jpg)
Docker 专栏 —— Dockerfile 指令详解
文章目录 ADD 复制文件COPY 复制文件ARG 设置构建参数CMD 容器启动命令ENTRYPOINT ⼊⼝点ENV 设置环境变量EXPOSE 声明暴露的端⼝FROM 指定基础镜像LABEL 为镜像添加元数据MAINTAINER 指定维护者的信息RUN 执⾏命令USER 设置⽤户VOLUME 指定挂载点WORKDIR 指定⼯作⽬录 ADD 复制…...
![](https://i-blog.csdnimg.cn/direct/5bff7c98516346619a277aafb9dd0fa3.png)
Spring Boot 项目自定义加解密实现配置文件的加密
在Spring Boot项目中, 可以结合Jasypt 快速实现对配置文件中的部分属性进行加密。 完整的介绍参照: Spring Boot Jasypt 实现application.yml 属性加密的快速示例 但是作为一个技术强迫症,总是想着从底层开始实现属性的加解密,…...
![](https://i-blog.csdnimg.cn/direct/2507617e04814969801452122fc2d22a.png)
在ubuntu下对NFS做性能测试
安装NFS 首先,安装服务 sudo apt update sudo apt install nfs-kernel-server然后创建共享文件夹 # 请自定义你自己的共享目录 sudo mkdir -p /exports/nfs4/homes sudo chmod -R 777 /exports/nfs4/homes# 这个可以根据no_root_squash标致选择设置。 # 如果不设…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring-Cloud-Gateway-Samples,nacos为注册中心,负载均衡
背景:本想找个简单例子看下,无奈版本依赖太过复杂,花了点时间。记录下吧 使用Spring Cloud Gateway作为网关服务,Nacos作为注册中心,实现对子服务的负载均衡访问。简单例子。 一、gateway-main-nacos服务端ÿ…...
![](https://i-blog.csdnimg.cn/img_convert/c50eb7e1cc9b01c6d387f741a1f4087f.png)
StarRocks Awards 2024 年度贡献人物
在过去一年,StarRocks 在 Lakehouse 与 AI 等关键领域取得了显著进步,其卓越的产品功能极大地简化和提升了数据分析的效率,使得"One Data,All Analytics" 的愿景变得更加触手可及。 虽然实现这一目标的道路充满挑战且漫…...
Autoencoder(李宏毅)机器学习 2023 Spring HW8 (Boss Baseline)
1. Autoencoder 简介 Autoencoder是一种用于学习数据高效压缩表示的人工神经网络。它由两个主要部分组成: Encoder 编码器将输入数据映射到一个更小的、低维空间中的压缩表示,这个空间通常称为latent space或bottleneck。 这一过程可以看作是数据压缩,去除冗余信息,仅保留…...
![](https://www.ngui.cc/images/no-images.jpg)
深入探索 ScottPlot.WPF:在 Windows 桌面应用中绘制精美图表的利器
一、ScottPlot.WPF 简介 ScottPlot.WPF 是基于 ScottPlot 绘图库专门为 Windows Presentation Foundation (WPF) 框架量身定制的强大绘图组件。它无缝集成到 WPF 应用程序中,为开发者提供了一种简洁、高效的方式来可视化数据,无论是科学研究中的实验数据展示、金融领域的行情…...
![](https://www.ngui.cc/images/no-images.jpg)
React中的useMemo 和 useEffect 哪个先执行?
在 React 组件的渲染过程中,useMemo 和 useEffect 的执行顺序是不同的。具体来说: useMemo 先执行:useMemo 是在 渲染阶段 执行的,它的作用是缓存计算结果,确保在渲染过程中可以直接使用缓存的值。 useEffect 后执行&…...
![](https://i-blog.csdnimg.cn/direct/f107a4e81b2c47dcafaad567db85ed27.png#pic_center)
错误修改系列---基于RNN模型的心脏病预测(pytorch实现)
前言 前几天发布了pytorch实现,TensorFlow实现为:基于RNN模型的心脏病预测(tensorflow实现),但是一处繁琐地方 一处错误,这篇文章进行修改,修改效果还是好了不少;源文章为:基于RNN模型的心脏病…...
![](https://i-blog.csdnimg.cn/img_convert/974577131340fc756e4b48ac557c875f.jpeg)
Table-Augmented Generation(TAG):Text2SQL与RAG的升级与超越
当下AI与数据库的融合已成为推动数据管理和分析领域发展的重要力量。传统的数据库查询方式,如结构化查询语言(SQL),要求用户具备专业的数据库知识,这无疑限制了非专业人士对数据的访问和利用。为了打破这一壁垒&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
Stable Diffusion本地部署教程(附安装包)
想使用Stable Diffusion需要的环境有哪些呢? python3.10.11(至少也得3.10.6以上):依赖python环境NVIDIA:GPUgit:从github上下载包(可选,由于我已提供安装包,你可以不用git)Stable Diffusion安装包工具包: NVIDIA:https://developer.nvidia.com/cuda-toolkit-archiv…...
![](https://i-blog.csdnimg.cn/direct/200af923c7fe47888ed27685a8e598a7.jpeg)
【物联网原理与运用】知识点总结(上)
目录 名词解释汇总 第一章 物联网概述 1.1物联网的基本概念及演进 1.2 物联网的内涵 1.3 物联网的特性——泛在性 1.4 物联网的基本特征与属性(五大功能域) 1.5 物联网的体系结构 1.6 物联网的关键技术 1.7 物联网的应用领域 第二章 感知与识别技术 2.1 …...
![](https://i-blog.csdnimg.cn/img_convert/004912d07814c27c009f041edd4283d2.webp?x-oss-process=image/format,png)
JuiceFS 2024:开源与商业并进,迈向 AI 原生时代
即将过去的 2024 年,是 JuiceFS 开源版本推出的第 4 年,企业版的第 8 个年头。回顾过去这一年,JuiceFS 社区版依旧保持着快速成长的势头,GitHub 星标突破 11.1K,各项使用指标增长均超过 100%,其中文件系统总…...
![](https://i-blog.csdnimg.cn/blog_migrate/415f4d65e495aff9ab45153a92afbc96.png)
C#,动态规划问题中基于单词搜索树(Trie Tree)的单词断句分词( Word Breaker)算法与源代码
1 分词 分词是自然语言处理的基础,分词准确度直接决定了后面的词性标注、句法分析、词向量以及文本分析的质量。英文语句使用空格将单词进行分隔,除了某些特定词,如how many,New York等外,大部分情况下不需要考虑分词…...
![](https://i-blog.csdnimg.cn/direct/a0c5424f13e54785ba6c00cbb420ac6a.png)
计算机网络(六)应用层
6.1、应用层概述 我们在浏览器的地址中输入某个网站的域名后,就可以访问该网站的内容,这个就是万维网WWW应用,其相关的应用层协议为超文本传送协议HTTP 用户在浏览器地址栏中输入的是“见名知意”的域名,而TCP/IP的网际层使用IP地…...
![](https://i-blog.csdnimg.cn/direct/57bc7936aad04d97994c915058aba699.png)
上海亚商投顾:沪指探底回升微涨 机器人概念股午后爆发
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天探底回升,沪指盘中跌超1.6%,创业板指一度跌逾3%,午后集体拉升翻红…...
![](https://www.ngui.cc/images/no-images.jpg)
conda相关操作
conda 是一个开源的包管理和环境管理工具,主要用于 Python 和数据科学领域。它可以帮助用户安装、更新、删除和管理软件包,同时支持创建和管理虚拟环境。以下是关于 conda 的所有常见操作: 1. 安装 Conda Conda 通常通过安装 Anaconda 或 Mi…...
![](https://i-blog.csdnimg.cn/direct/0ecaf42659ef4102833be224134df830.png)
使用TCP协议实现智能聊天机器人
实验目的与要求 本实验是程序设计类实验,要求使用原始套接字编程,掌握TCP/IP协议与网络编程Sockets通信模型,并根据教师给定的任务要求,使用TCP协议实现智能聊天机器人。 (1)熟悉标准库socket 的用法。 …...
![](https://www.ngui.cc/images/no-images.jpg)
PHP二维数组去除重复值
Date: 2025.01.07 20:45:01 author: lijianzhan PHP二维数组内根据ID或者名称去除重复值 代码示例如下: // 假设 data数组如下 $data [[id > 1, name > Type A],[id > 2, name > Type B],[id > 1, name > Type A] // 重复项 ];// 去重方法 $dat…...
![](https://i-blog.csdnimg.cn/direct/c9a8601b771d45c5ba429ecfcc1ef1b1.png#pic_center)
2025年01月11日Github流行趋势
项目名称:xiaozhi-esp32 项目地址url:https://github.com/78/xiaozhi-esp32项目语言:C历史star数:2433今日star数:321项目维护者:78, MakerM0, whble, nooodles2023, Kevincoooool项目简介:构建…...
![](https://i-blog.csdnimg.cn/direct/7264c764f554465ea1fa600ea2c0ce3b.png)
备战蓝桥杯 队列和queue详解
目录 队列的概念 队列的静态实现 总代码 stl的queue 队列算法题 1.队列模板题 2.机器翻译 3.海港 双端队列 队列的概念 和栈一样,队列也是一种访问受限的线性表,它只能在表头位置删除,在表尾位置插入,队列是先进先出&…...
![](https://i-blog.csdnimg.cn/direct/cace272f4c234ed7888cb62bd86d227a.jpeg)
IT面试求职系列主题-Jenkins
想成功求职,必要的IT技能一样不能少,先说说Jenkins的必会知识吧。 1) 什么是Jenkins Jenkins 是一个用 Java 编写的开源持续集成工具。它跟踪版本控制系统,并在发生更改时启动和监视构建系统。 2)Maven、Ant和Jenkins有什么区别…...
![](https://i-blog.csdnimg.cn/direct/1321f81a45ad4a34a6505f8a305e0b5b.png)
Vue篇-06
1、路由简介 vue-rooter:是vue的一个插件库,专门用来实现SPA应用 1.1、对SPA应用的理解 1、单页 Web 应用(single page web application,SPA)。 2、整个应用只有一个完整的页面 index.html。 3、点击页面中的导航链…...
![](https://i-blog.csdnimg.cn/direct/a46f12e580824c8eae50d99e6b996a7f.png)
mysql binlog 日志分析查找
文章目录 前言一、分析 binlog 内容二、编写脚本结果总结 前言 高效快捷分析 mysql binlog 日志文件。 mysql binlog 文件很大 怎么快速通过关键字查找内容 一、分析 binlog 内容 通过 mysqlbinlog 命令可以看到 binlog 解析之后的大概样子 二、编写脚本 编写脚本 search_…...
![](https://www.ngui.cc/images/no-images.jpg)
ubuntu 配置OpenOCD与RT-RT-thread环境的记录
1.git clone git://git.code.sf.net/p/openocd/code openocd 配置gcc编译环境 2. sudo gedit /etc/apt/source.list #cdrom sudo apt-get install git sudo apt-get install libtool-bin sudo apt-get install pkg-config sudo apt-install libusb-1.0-0-dev sudo apt-get…...
![](https://i-blog.csdnimg.cn/direct/60de5bf9cf1d4a9caf03506b45a18863.png)
双系统解决开机提示security Policy Violation的方法
最近,Windows系统更新后,发现电脑开机无法进入桌面,显示“Verifiying shim SBAT data failed: security Policy Violation; So mething has gone seriously Wrong: SBAT self-check failed: Security Policy Violation”的英文错误信息。为了…...
![](https://www.ngui.cc/images/no-images.jpg)
附加共享数据库( ATTACH DATABASE)的使用场景
附加共享数据库(使用 ATTACH DATABASE)的功能非常实用,通常会在以下几种场景下需要用到: 1. 跨数据库查询和分析 场景: 你的公司有两个独立的数据库: 一个存储了学生信息 (school.db)一个存储了员工信息 …...
![](/images/no-images.jpg)
上海网站建设优势/青岛网站建设制作推广
题目 输入一个链表,从尾到头打印链表每个节点的值。返回新链表。 分析 可以借助栈也可以使用递归 代码 /*** 从尾到头打印列表*/ public class PrintListReverse {public static void main(String[] args) {ListNode node1 new ListNode();ListNode node2 ne…...
![](/images/no-images.jpg)
深圳p2p网站建设/做销售有什么技巧和方法
一、忘记除SYS、SYSTEM用户之外的用户的登录密码。用SYS (或SYSTEM)用户登录: CONN SYS/PASS_WORD AS SYSDBA;使用如下语句修改用户的密码: ALTER USER user_name IDENTIFIED BY "newpass";注意:密码不能全是数字。并且不能是数字开头。否则会出现&#x…...
帮一个公司做网站多少钱/超级优化
目前,信息流短视频排序是基于CTR预估Wide&Deep深层模型。在Wide&Deep模型基础上做一系列相关优化,包括相关性与体感信号引入、多场景样本融合、多模态学习、树模型等,均取得不错收益。 总体上,短视频模型优化可分为两部分…...
刷东西网站怎么做/企业营销策划方案范文
动态类型 在 kotlin 中调用 java 代码 import java.util.* fun demo(source: List<Int>) {val list ArrayList<Int>()for (item in source )list.add(item)for (i in 0..source.size() - 1)list[i] source[i] } java无返回值的void在kotlin中要用unit代替。...
![](https://images2017.cnblogs.com/blog/901376/201707/901376-20170727134336586-1384645203.png)
flask做视频网站/建站教程
因为项目需求,现在需要利用EF 操作由Arccatalog生成的sql server空间数据库.。在此之前,一直没有接触过空间数据库,在操作空间数据库时 绕了许多弯。。。 因此写一篇随笔做一个总结。 首先,我们了解一下空间数据库:空间数据库是指…...
![](/images/no-images.jpg)
有什么网站可以做编程题/企业推广策略
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6937 Accepted Submission(s): 2957Problem DescriptionXX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Supe…...