【发布时间】:2020-04-01 21:02:14
【问题描述】:
我在 JavaScript 中有以下代码来计算数组中总和等于 n 的最小元素:
function findMinSum(arr, n){
if(!arr) return
let min
for (let i=0; i<arr.length; i++) {
/* if a number equals the sum, it's obviously
* the shortest set, just return it
*/
if (arr[i] == n) return [arr[i]]
/* recursively call on subset with
* sum adjusted for removed element
*/
let next = findMinSum(arr.slice(i+1), n-arr[i])
/* we only care about next if it's shorter then
* the shortest thing we've seen so far
*/
if (next){
if(min === undefined || next.length < min.length){
min = [arr[i], ...next]
}
}
}
return min && min /* if we found a match return it, otherwise return undefined */
}
我从here 得到这个代码。
我想将其转换为 Python,所以我做了以下操作:
def findMinSum(arr, n):
if not arr:
return
min = []
min_len = len(min)
for i in range(0, len(arr)):
if(arr[i] == n):
return (arr[i])
next = []
next = findMinSum(arr[i+1:], n-arr[i])
if(next == list):
next_len = len(next)
else:
next_len = next
if(next):
print(next) # printing next for debugging purpose
if( ( not min ) or (next_len < min_len) ):
min = [ next, arr[i]]
return min
arr = [8, 6, 1, 5, 9, 3]
get_min = findMinSum(arr, 14)
print(get_min)
但是当我运行这段代码时,我得到了以下错误:
3
[3, 1]
9
[[3, 1], 6]
3
[3, 9]
Traceback (most recent call last):
File "test1.py", line 34, in <module>
min2 = findMinSum(arr, 14)
File "test1.py", line 25, in findMinSum
if( ( not min ) or (next_len < min_len) ):
TypeError: '<' not supported between instances of 'list' and 'int'
预期的输出应该是[8, 6] 或[9, 5]。
我想不出任何其他方式来编写代码,因为我是 Python 的新手。另外我不想导入除 numpy 之外的任何其他模块。
我的翻译哪里出错了?
【问题讨论】:
-
欢迎来到 SO!
if(next == list):中的list是什么?建议不要使用listnext或其他内置变量名称。此外,请跳过 Python 中的()s 以获取条件和返回值。你可能不小心创建了元组。 -
@ggorlen 谢谢!我正在检查下一个是否是列表。此外,我尝试更改变量名称,但我得到相同的输出。
-
那行不通——你想在这里
isinstance或type。是的,next是一个迭代器函数,所以我只是在写一个一般性的评论,而不是一个解决方案。缓存len调用也是不好的做法,这可能是原因:min_len = len(min)。当min更改时,这永远不会更新。min也覆盖了内置函数min。 -
顺便说一句,答案不应该是 6、9、3 吗?
-
@ggorlen 感谢您的建议,我将尝试在我的代码中实现它们。
标签: javascript python python-3.x list