【发布时间】:2018-06-14 10:02:07
【问题描述】:
为了练习 Scala,我想用 Scala 解决简单的动态编程练习。对于一些练习,我已经编写了 Python 实现。大多数时候我使用 Python 将中间结果保存在一个数组中。
例如这个练习:
在给定价值和硬币列表的情况下,该算法会输出达到某个价值所需的最少硬币数量。 (假设有无限数量的硬币。)
def automat(n, coins = [1,2,5,10,20,50,100,200]):
A = [0]
for i in range(1, n + 1):
smallest_change = min([A[i - coin] for coin in coins if 0 <= i - coin])
A.append(smallest_change + 1)
return A[n]
在 Python 中看起来非常简单。不过,我在 Scala 中编写相同的代码时遇到问题。由于函数范式,我不想使用 for 循环,而是使用尾递归算法来解决该问题。我找不到任何好的解决方案。也许尾递归算法不是正确的方法,并且有一种不同的 scala 方法来实现这个简单的算法。
我已经在寻找动态编程练习的 scala 实现,但还没有找到好的来源。有人知道实现此功能的 scala 方式是什么样的吗?
更新:
到目前为止,我最接近的方法与 Dimas 尾递归方法非常相似。看起来是这样的
def automat(n: Int, coins: List[Int] = List(1, 2, 5, 10, 20, 50, 100, 200)): Int = {
inner(n, n + 1, coins, List(0)).last
}
def inner(n: Int, m: Int, coins: List[Int], result: List[Int]): List[Int] = n match {
case 0 => result
case _ => inner(n-1, m, coins, result ::: List(coins.collect { case coin if (0 <= m - n - coin) => result(m - n - coin) }.min + 1))
}
【问题讨论】:
标签: python algorithm scala dynamic-programming