- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下命令式代码,该代码在 3 位数字的乘积中查找最大的回文数(是的,这是“[18 世纪杰出数学家]”网站的第一个任务之一):
curmax = 0
for i in range(999,100):
for j in range(999,100):
if ((i*j) < curmax): break
if (pal(i*j)):
curmax = i*j
break
print curmax
由于我目前正在学习 Haskell,我的问题是,你如何翻译这个(以及基本上任何包含比简单迭代更复杂的内容的命令式结构,例如中断、继续、临时变量以及所有这些)到 Haskell?
我的版本是
maxpal i curmax
| i < 100 = curmax
| otherwise = maxpal (i-1) (innerloop 999)
where
innerloop j
| (j < 100) || (p < curmax) = curmax
| pal p = p
| otherwise = innerloop (j-1)
where p = i*j
main = print $ maxpal 999 0
但这看起来我们仍然处于势在必行的丑陋镇。
那么您有什么建议,处理此类 FP 式案例的方法是什么?
最佳答案
与 Daniel 和 sepp2k 的类似答案:
惰性函数式编程使您能够以比您在问题中的命令式控制流中看到的更加模块化的方式编写程序。例如,形成因子列表 999...100,然后是所有乘积,然后过滤以仅保留回文,然后计算最大值。由于惰性,这些中间列表将仅在需要时产生,并且将被增量回收。
更多解释和示例请参见John Hughes的经典论文Why Functional Programming Matters .
maxpal :: Int
maxpal = maximum [i*j | i <- factors, j <- factors, pal (i*j) ]
factors :: [Int]
factors = [999,998..100]
pal :: Show a => a -> Bool
pal = palL . show
palL :: (Eq a) => [a] -> Bool
palL xs = xs == reverse xs
关于haskell - 将带有break-s/continue-s的命令式控制流转换为haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4512541/
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我正在做一个相当简单的示例来学习如何使用 ocaml 作为命令式语言。我的猜测是我搞乱了分号,但我在代码中找不到任何错误 let sort array = for index = 0 to (Arra
我是函数式编程的新手,我刚遇到一些事情,想知道是否有解决办法。 假设我有 myArray = [ { a : 1 } { a : 4 } { a : 5 } { a : 6 } {
我正在尝试在我的 Node 应用程序的 dockerode 容器中编译并执行 java 程序。我可以通过首先使用基本 javascript 写入 tmp.java 文件,然后运行以下 shell 命令
Quicksort 通常被描述为一种原位(就地)算法,尽管它需要 O(log n) 堆栈空间。那么 in situ 是否意味着“需要少于 O(n) 的额外空间”,或者堆栈空间通常不算作空间复杂度(但为
我需要一些关于 Reactive JS 和“if 语句”的帮助 我不知道如何在 Reactive JS 中实现一个简单的代码在 Spark AR 中是这样的: if( boolvalue=true)
我是 Scala 的新手,我正在尝试从 IndexedSeq 创建一个大 map ,我在 SO 上发现了一个提及,即函数式 map 创建比命令式 Java map 创建慢得多,我决定自己测试一下。到目
我是一名优秀的程序员,十分优秀!