从JavaScript到Python的子集求和算法转换
我有以下JavaScript代码来计算数组中的最小元素,其和等于从JavaScript到Python的子集求和算法转换,javascript,python,python-3.x,list,Javascript,Python,Python 3.x,List,我有以下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 */
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 */
}
函数findMinSum(arr,n){
如果(!arr)返回
让敏
for(设i=0;i
我想将其转换为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)
def findMinSum(arr,n):
如果没有arr:
返回
最小值=[]
最小长度=最小长度(最小)
对于范围(0,len(arr))内的i:
如果(arr[i]==n):
返回(arr[i])
下一步=[]
next=findMinSum(arr[i+1:],n-arr[i])
如果(下一个==列表):
next_len=len(next)
其他:
下一个
如果(下一个):
打印(下一页)#打印下一页用于调试
如果((非最小值)或(下一个<最小值)):
min=[next,arr[i]]
返回最小值
arr=[8,6,1,5,9,3]
get_min=findMinSum(arr,14)
打印(获取最小值)
但当我运行此代码时,会出现以下错误:
3
[3, 1]
9
[[3, 1], 6]
3.
[3, 9]
回溯(最近一次呼叫最后一次):
文件“test1.py”,第34行,在
min2=findMinSum(arr,14)
findMinSum中第25行的文件“test1.py”
如果((非最小值)或(下一个<最小值)):
TypeError:“这里有各种各样的问题
- 永远不要覆盖内置代码。Python定义了
min
、next
和list
。如果覆盖它们,可能会遇到非常微妙的错误
- Python没有数组,它有列表。从不缓存对
len
的调用——此代码不会更新min\u len=len(min)
,因此如果min
被更新,则该值在以后的循环比较中是过时的
- 避免在条件语句和返回语句周围使用不必要的括号,因为括号用于创建元组。
return(arr[i])
应该是return[arr[i]]
(单个元素列表)
min=[next,arr[i]]
与[arr[i],…next]
在排序或解包/摊铺时不匹配。使用min=[arr[i],*next]
展平next
- JS和Python对未定义的
/无
和布尔数组/列表值的处理方式不同。JS将空数组视为真数组,而Python将空列表视为假数组。min=[]
不会捕获隐式设置min=undefined
的原始JS代码,因此if not min
会检查min
是否为null或空,这与原始JS版本不可比
无需检查类型;检查无
或非无
即可
if(next){if(more-stuff…
可以使用和
只包含一个块。没有理由嵌套(这在原始版本中是个问题)
在大多数情况下(如果使用范围,range(0,len(some_list))
可以是range(len(some_list))
,而不是range
遵守。函数和变量名使用snake\u case
这是我的回信:
def find_smallest_sum(lst, n):
if not lst:
return None
smallest = None
for i, e in enumerate(lst):
if e == n:
return [e]
next_lst = find_smallest_sum(lst[i+1:], n - e)
if next_lst is not None and (smallest is None or len(next_lst) < len(smallest)):
smallest = [e, *next_lst]
return smallest
if __name__ == "__main__":
print(find_smallest_sum([10, 0, -1, 20, 25, 30], 59)) # => [10, -1, 20, 30]
print(find_smallest_sum([8, 6, 1, 5, 9, 3], 14)) # => [5, 9]
def find_minimable_sum(lst,n):
如果不是lst:
一无所获
最小=无
对于枚举中的i,e(lst):
如果e==n:
返回[e]
下一个=找到最小的和(lst[i+1:],n-e)
如果next_lst不是None且(最小值是None或len(next_lst)[10,-1,20,30]
打印(查找最小的总和([8,6,1,5,9,3],14))#=>[5,9]
欢迎使用SO!如果(下一个==列表):
中的列表是什么?
?建议不要使用列表下一个或其他内置变量名。另外,跳过()
s在Python中用于条件和返回值。您可能会意外地生成元组。@ggorlen谢谢!我正在检查next是否是列表。此外,我尝试更改变量名,但仍然得到相同的输出。这不起作用-您希望isinstance
或在此处键入
。是的,next
是一个迭代或者函数,所以我只是写一个一般性的注释,而不是一个解决方案。缓存len
调用也是一种不好的做法,这可能是原因:min\u len=len(min)
。当min
发生更改时,此项不会更新。min
也会覆盖内置函数min
。顺便说一句,答案不是6、9、3吗?@ggorlen感谢您的建议,我将尝试在代码中实现它们。