递归函数的有趣行为

2024-04-25 21:49:25 发布

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

t = 8
string = "1 2 3 4 3 3 2 1"
string.replace(" ","")
string2 = [x for x in string]
print string2

for n in range(t-1):
    string2.remove(' ')

print string2

def remover(ca):
    newca = []
    print len(ca)

    if len(ca) == 1:
        return ca
    else:
        for i in ca:
            newca.append(int(i) - int(min(ca)))

    for x in newca:
        if x == 0:
            newca.remove(0)

    print newca
    return remover(newca)

print (remover(string2))

它应该是一个程序,接收一个数字列表,列表中的每一个数字都从中减去min(list)。它在最初的几次迭代中工作得很好,但在接近结束时就不行了。我在这里和那里添加了打印语句以帮助解决问题。你知道吗

编辑:

t = 8

string = "1 2 3 4 3 3 2 1"

string = string.replace(" ","")

string2 = [x for x in string]

print len(string2)

def remover(ca):

    newca = []

    if len(ca) == 1: return()

    else:
        for i in ca:
            newca.append(int(i) - int(min(ca)))

    while 0 in newca:
        newca.remove(0)

    print len(newca)

    return remover(newca)


print (remover(string2))

Tags: inforstringlenreturnifminreplace
3条回答

(不是真正的答案,JFYI:)

如果你把程序分解成适当的部分,你的程序可能会短得多。你知道吗

def aboveMin(items):
  min_value = min(items) # only calculate it once
  return differenceWith(min_value, items)

def differenceWith(min_value, items):
  result = []
  for value in items:
    result.append(value - min_value)
  return result

像往常一样,上述模式可以替换为理解:

def differenceWith(min_value, items):
  return [value - min_value for value in items]

试试看:

>>> print aboveMin([1, 2, 3, 4, 5])
[0, 1, 2, 3, 4]

请注意,没有项目是如何被删除的,而且数据通常不会发生任何变化。这种方法对程序有很大的帮助;试试看。你知道吗

所以如果我理解了你所期望的描述

我相信下面的脚本会让你更接近你的目标。你知道吗

逻辑:

  • split将返回一个由提供给原始输入的每个“数字”组成的数组,而即使您使用replace的输出,最终也会得到一个很长的数字(您去掉了分隔每个数字的空格),而实际的字符串拆分将其拆分为个位数,这与您描述的意图不符
  • 您应该测试提供的每个输入是否为整数
  • 因为您已经在函数中进行了打印,所以不需要它返回任何内容
  • 避免在新数组中添加零,只需先进行测试

string = raw_input()

array = string.split()
intarray = []
for x in array:
  try:
    intarray.append(int(x))
  except:
    pass

def remover(arrayofint):
  newarray = []
  minimum = min(arrayofint)
  for i in array:
    if  i > minimum:
      newarray.append(i - minimum)
  if len(newarray) > 0:
    print newarray
    remover(newarray)

remover(intarray)
for x in newca:
    if x == 0:
        newca.remove(0)

迭代一个列表并同时从中删除内容可能会导致奇怪和意外的behvaio。尝试改用while循环。你知道吗

while 0 in newca:
    newca.remove(0)

或列表:

newca = [item for item in newca if item != 0]

或者创建另一个临时列表:

newnewca = []
for x in newca:
    if x != 0:
        newnewca.append(x)

print newnewca

return remover(newnewca)

相关问题 更多 >