Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:列表、变异、递归问题_Python_List_Recursion_Mutation - Fatal编程技术网

Python:列表、变异、递归问题

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

我要做的是在Bounds中创建一个最终函数,它使用一个int值列表和两个上下整数。它生成一个整数,其值小于下限,大于上限。它也会改变值。如果值中存在小于下限的int,则该值将变为下限;如果值中存在大于上限的int,则该值将变为上限。 例如:listin=[-3,82105,86,-10119100,70]内边界listint,0,100=>4,v变异为[0,82100,86,0100,70]

到目前为止,我已经尝试了两件事:

我尝试的第一件事是:

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=lenvalues

另一种方法是使用列表理解:

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]