Python:列表、变异、递归问题
我要做的是在Bounds中创建一个最终函数,它使用一个int值列表和两个上下整数。它生成一个整数,其值小于下限,大于上限。它也会改变值。如果值中存在小于下限的int,则该值将变为下限;如果值中存在大于上限的int,则该值将变为上限。 例如:listin=[-3,82105,86,-10119100,70]内边界listint,0,100=>4,v变异为[0,82100,86,0100,70] 到目前为止,我已经尝试了两件事: 我尝试的第一件事是:Python:列表、变异、递归问题,python,list,recursion,mutation,Python,List,Recursion,Mutation,我要做的是在Bounds中创建一个最终函数,它使用一个int值列表和两个上下整数。它生成一个整数,其值小于下限,大于上限。它也会改变值。如果值中存在小于下限的int,则该值将变为下限;如果值中存在大于上限的int,则该值将变为上限。 例如:listin=[-3,82105,86,-10119100,70]内边界listint,0,100=>4,v变异为[0,82100,86,0100,70] 到目前为止,我已经尝试了两件事: 我尝试的第一件事是: def inbounds(values, low
def inbounds(values, lower, upper):
if values == []:
return 0
elif lower <= values[0] <= upper:
return inbounds(values[1:], lower, upper)
elif lower > values[0]:
values[0] = lower
return inbounds(values[1:], lower, upper) + 1
else:
values[0] = upper
return inbounds(values[1:],lower, upper) + 1
这确实返回了4,但问题是我意识到它只会变异值[0],因此我尝试了第二次尝试,通过创建另一个函数来解决这个问题,该函数具有pos而不是0,并且每次它递归时,我都向pos添加1:
def inbounds_from(values, lower, upper, pos):
if pos < len(values):
return 0
elif lower <= values[pos] <= upper:
return inbounds(values, lower, upper, pos+1)
elif lower > values[pos]:
values[pos] = lower
return inbounds(values, lower, upper, pos+1) + 1
else:
values[pos] = upper
return inbounds(values,lower, upper, pos+1) + 1
def inbounds(values, lower, upper):
inbounds_from(values, lower, upper, 0)
问题是inbounds什么都不做!!?为什么?当我测试这个例子的时候,我没有得到4,我得到了没有任何突变的原始inlist
编辑:我还尝试更改pos的基本情况,问题是在第一种情况下。如果pos
count = sum(upper <= v <= lower for v in values)
values = [min(upper, max(v, lower)) for v in values] # mutate
你的第二次尝试没有什么问题。您的基本情况是错误的-如果pos>=lenvalues,则应该是错误的。另外,您是在包装器函数上递归,而不是在helper/inside函数上递归。最后,您需要在包装器函数中返回对helper函数的调用。见下文:
In [4]: def inbounds_from(values, lower, upper, pos):
...: if pos >= len(values):
...: return 0
...: elif lower <= values[pos] <= upper:
...: return inbounds_from(values, lower, upper, pos+1)
...: elif lower > values[pos]:
...: values[pos] = lower
...: return inbounds_from(values, lower, upper, pos+1) + 1
...: else:
...: values[pos] = upper
...: return inbounds_from(values,lower, upper, pos+1) + 1
...:
...: def inbounds(values, lower, upper):
...: return inbounds_from(values, lower, upper, 0)
...:
In [5]: test = [-3,82,105,86,-10,119,100,70]
In [6]: inbounds(test, 0, 100)
Out[6]: 4
In [7]: test
Out[7]: [0, 82, 100, 86, 0, 100, 100, 70]
将列表的片段传递给每个递归调用,这将返回原始列表的副本。您不会在原始列表中看到任何更改。尝试使用迭代(Python的方法),或者如果必须使用递归,则尝试传递当前索引,并以index==lenvaluesSorry为基本大小写递增,但没有看到您已经尝试这样做了。问题可能是包装器函数中缺少return。它应该是原版的变种,但我现在离电脑远了,不能摆弄它。啊。你的基本情况是错误的。它永远不会超过if'块,因为如果要从索引0开始计算,它应该是if pos>=lenvalues。…@juanpa.arrivillaga我尝试了这个,但不幸的是仍然得到了相同的结果。我尝试了pos,从技术上讲,它不会改变值。您将需要值[:]=[非常感谢您的帮助和解释!我不知道我是如何错过了包装器函数的递归,而不是帮助器…在包装器上添加返回非常有意义!
In [8]: def in_bounds_iter(values, lower, upper):
...: count = 0
...: for i, val in enumerate(values):
...: if not(lower <= val <= upper):
...: count += 1
...: values[i] = min(upper, max(val, lower))
...: return count
...:
In [9]: test = [-3,82,105,86,-10,119,100,70]
In [10]: in_bounds_iter(test, 0, 100)
Out[10]: 4
In [11]: test
Out[11]: [0, 82, 100, 86, 0, 100, 100, 70]