我的递归函数的有趣行为

时间:2014-11-04 19:12:35

标签: python recursion

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))

3 个答案:

答案 0 :(得分:2)

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

迭代列表并同时删除它可能会导致奇怪和意外的behvaior。请尝试使用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)

答案 1 :(得分:1)

(不是真正的答案,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]

请注意,如何删除任何项目,并且数据通常不会发生变异。这种方法有助于推理关于程序的很多事情;试试吧。

答案 2 :(得分:0)

所以 IF 我已经理解了你所期望的描述,

我相信下面的脚本会让您更接近目标。

逻辑:

  • split将返回一个由提供给raw_input的每个“数字”组成的数组,而即使你使用了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)