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

2024-09-30 06:24:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我要做的是创建一个final函数inbounds,它使用一个int(值)列表和两个上下整数。它产生一个小于下限值大于上限值的整数。它也会改变值。如果值中有一个小于lower的int,它将把这个值变为lower,如果值中有一个大于upper的int,那么它将把这个值变为upper。 例如:listin=[-3,82105,86,-10119100,70]inbounds(listin,0,100)=>;4,v突变为[0,82100,86,0100100,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:

^{pr2}$

问题是界内没有任何作用!!?为什么?当我测试这个例子时,我没有得到4,我得到了没有任何突变的原始inlist。。。在

编辑:我还尝试更改pos<;=len(值)的基本大小写,但仍然不起作用


Tags: 函数posgt列表return整数upperlower
2条回答

问题在第一种情况下。if pos < len(values)应该改为pos >= len(values)。在

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

count = sum(upper <= v <= lower for v in values)
values = [min(upper, max(v, lower)) for v in values]  # mutate

你的第二次尝试没有什么问题。你的基本情况是错误的-它应该是if pos >= len(values)。另外,您是在包装器函数上递归,而不是helper/inside函数。最后,您需要return调用包装器函数中的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中要避免递归。下面是一个Python式的方法,借用了马拉的巧妙的min(max())技巧:

^{pr2}$

相关问题 更多 >

    热门问题