我正在寻找关于项目欧拉的问题三十一,请问,有多少不同的方法可以使用任意数量的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) 每次调用一个函数时,如果给定的一组参数值的结果尚未被记忆,我想将结果放入内存表中.一列用于存储结果,另一列用于存储参数值.
我该如何最好地实现这一点?争论的种类繁多,包括一些枚举.
在C#中,我通常使用DataTable.Scala中有同等的东西吗?
在Scala中使用SBT工具链时,是否可以编写一个任务来读取项目源的特殊部分,以便在编译时生成scala-code.
关于这个的任何想法甚至文章/教程?我正在寻找与Template Haskell相似的东西.
我正在编写一个函数来查找三角形数字,并且以递归方式编写它的自然方式:
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函数,但我想要一个能够记忆我传递给它的任何函数的解决方案.
这是我项目中类型安全的麻烦违规,所以我正在寻找一种方法来禁用它.似乎如果函数采用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) 我正在创建一个简单的缓存特征(轻松缓存我的函数):
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关键字创建别名?特别是我有一些涉及"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 ×6
memoization ×2
closures ×1
java ×1
lua ×1
optimization ×1
recursion ×1
syntax ×1
tuples ×1