相关疑难解决方法(0)

功能范式中的动态编程

我正在寻找关于项目欧拉的问题三十一,请问,有多少不同的方法可以使用任意数量的1p,2p,5p,10p,20p,50p,£1(100p)和£的硬币赚2英镑2(200p).

有递归解决方案,例如Scala中的这个解决方案(由Pavel Fatin提供)

def f(ms: List[Int], n: Int): Int = ms match {
  case h :: t =>
    if (h > n) 0 else if (n == h) 1 else f(ms, n - h) + f(t, n)
  case _ => 0
} 
val r = f(List(1, 2, 5, 10, 20, 50, 100, 200), 200)
Run Code Online (Sandbox Code Playgroud)

虽然运行速度足够快,但它的效率相对较低,调用f函数大约560万次.

我看到了其他用Java编写的动态编程解决方案(来自葡萄牙的wizeman)

final static int TOTAL = 200;

public static void main(String[] args) {
    int[] coins = {1, 2, 5, 10, 20, …
Run Code Online (Sandbox Code Playgroud)

java functional-programming scala dynamic-programming

22
推荐指数
5
解决办法
5307
查看次数

在Scala中用于存储内存中可变数据表的类型是什么?

每次调用一个函数时,如果给定的一组参数值的结果尚未被记忆,我想将结果放入内存表中.一列用于存储结果,另一列用于存储参数值.

我该如何最好地实现这一点?争论的种类繁多,包括一些枚举.

在C#中,我通常使用DataTable.Scala中有同等的东西吗?

scala memoization data-structures scala-collections

20
推荐指数
2
解决办法
9113
查看次数

使用Scala生成代码

在Scala中使用SBT工具链时,是否可以编写一个任务来读取项目源的特殊部分,以便在编译时生成scala-code.

关于这个的任何想法甚至文章/教程?我正在寻找与Template Haskell相似的东西.

code-generation scala template-haskell

13
推荐指数
3
解决办法
5985
查看次数

如何编写通用memoize函数?

我正在编写一个函数来查找三角形数字,并且以递归方式编写它的自然方式:

function triangle (x)
   if x == 0 then return 0 end
   return x+triangle(x-1)
end
Run Code Online (Sandbox Code Playgroud)

但是尝试计算前100,000个三角形数字会在一段时间后出现堆栈溢出而失败.这是一个理想的memoize函数,但我想要一个能够记忆我传递给它的任何函数的解决方案.

optimization recursion lua closures memoization

11
推荐指数
4
解决办法
7439
查看次数

scala将多个函数调用参数合并到一个元组中 - 这可以被禁用吗?

这是我项目中类型安全的麻烦违规,所以我正在寻找一种方法来禁用它.似乎如果函数采用AnyRef(或java.lang.Object),您可以使用任何参数组合调用该函数,Scala会将参数合并到Tuple对象中并调用该函数.

在我的情况下,该函数不期望一个元组,并在运行时失败.我希望在编译时捕获这种情况.

object WhyTuple {
 def main(args: Array[String]): Unit = {
  fooIt("foo", "bar")
 }
 def fooIt(o: AnyRef) {
  println(o.toString)
 }
}
Run Code Online (Sandbox Code Playgroud)

输出:

(foo,bar)
Run Code Online (Sandbox Code Playgroud)

syntax scala tuples tuple-packing

7
推荐指数
2
解决办法
1280
查看次数

特征上可变数量的类型

我正在创建一个简单的缓存特征(轻松缓存我的函数):

trait Cache[A,B] {
  def _calc(v:A):B
  private var cache = Map[A,B]()
  def calc(v:A):B = {
    cache.get(v) match {
      case Some(x) => x
      case None => 
        val x = _calc(v)
        cache += (v -> x)
        x
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

object Sol extends Cache[Int,Int] {
  def _calc(v:Int):Int = { /* do something here */ }
}
Sol.calc(5)
Run Code Online (Sandbox Code Playgroud)

它工作正常,但问题出现在我需要缓存具有更多参数的函数时 - 所以我需要开发特征Cache2,Cache3,来自第一个特征的所有复制粘贴代码.

可能的解决方法是将具有多个参数的函数转换为接受元组的函数,但这似乎不正确.

有没有办法更普遍地做到并避免干扰原则违规?

scala

5
推荐指数
1
解决办法
691
查看次数

scala:关键字的别名?

有没有办法为scala关键字创建别名?特别是我有一些涉及"val"的样板语法,为了使它更容易阅读,我希望能够键入"@@"并将其转换为val.

编辑:

在某些情况下,能够替换"lazy val"而不仅仅是"val"可能非常方便.用例与充当python装饰器的函数有关.它看起来像这样:

lazy val function = Decorate(function_ _)
def function_(x: Int, ...) = { ... }
Run Code Online (Sandbox Code Playgroud)

如果它看起来像这样会好很多:

@ function = Decorate(function_ _)
def function_(x: Int, ...) = { ... }
Run Code Online (Sandbox Code Playgroud)

只是为了在def的顶部没有堆叠的val,两个名字都非常相似.(函数名称并不意味着被调用,所以它是最干净的,使名称相似.)

scala

1
推荐指数
1
解决办法
635
查看次数