【问题标题】:Scala pattern matching on factorial need阶乘需求的Scala模式匹配
【发布时间】:2015-08-30 10:00:56
【问题描述】:

目前正在学习 Scala,特别是学习模式匹配,我在 Scala 中编写了这个简单的阶乘方法:

 def factorial(n : Int) : Int = {
   if(n <= 1)
     1
   else
    n * factorial(n -1)
}

然后我想,我可以使用模式匹配并写下这个:

def fact(n : Int) : Int = n match {
  case 0 => 1
  case n => n * fact(n -1)
}

但我认为模式匹配的重点是对数据进行排序,为什么我需要在阶乘之类的东西上使用它?

非常感谢。

【问题讨论】:

  • 你不需要这样做。但你可以,正如你刚刚证明的那样。
  • 这很可爱。斐波那契会更可爱,因为您需要两个初始设置。但是通过递归做斐波那契也有点傻,因为它不能很好地扩展。
  • @Paul:是什么让您说斐波那契的递归实现无法扩展?尾递归实现与迭代实现一样可扩展。
  • @Marth 我不是其可扩展性方面的专家,但我似乎记得因为斐波那契是随着 N 的增长而变得难以计算的函数之一除非值被记忆。
  • @Marth 很高兴知道。我发现了更多here

标签: scala pattern-matching


【解决方案1】:

但我认为模式匹配的重点是对数据进行排序

实际上,模式匹配非常适合编写任何类型的算法(例如您在示例中使用的算法)。事实上,Odersky 的Functional Programming in Scala 在线课程的大部分内容都非常关注使用模式匹配编写算法。

【讨论】:

  • 我会考虑学习这门课程的乐趣!!很棒的分享人。
  • 我强烈推荐这门课程!讲师是 Scala 的创造者。
  • 太棒了,我现在实际上正在阅读马丁的书来学习它,我不敢相信我以前没有检查过 Coursera。这是一本很棒的书。
【解决方案2】:

数据解构和提取,再加上数据类型,在模式匹配中是必不可少的。

在阶乘的情况下,我们以不同的方式提取和处理大于 1 的值以将其设为 1,这可能是对模式匹配的一种微不足道的使用,它很可能被替换为 if-else 表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-17
    • 2021-12-17
    • 1970-01-01
    • 2012-10-31
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多