寻找下一个最大值时,Python算法出错

3
我编写了一个算法,它扫描一个“ID”文件,并将该值与整数i的值进行比较(我已将整数转换为字符串进行比较,并且已将行中的“\ n”前缀修剪掉)。该算法针对文件中的每行(每个ID)比较这些值。如果它们相等,则算法增加i的值1并使用新值进行递归。如果该值不相等,则将其与文件中的下一行进行比较。它执行此操作直到它有一个在文件中不存在的i的值,然后返回该值以用作下一个记录的ID。
我的问题是,我有一个ID列表文件,其中列出了1、3、2,因为我删除了一个ID为2的记录,然后创建了一个新的记录。这证明了算法的正确性,因为它给出了先前删除的ID为2的新记录的ID。但是,当我创建一个新纪录时,下一个ID是3,导致我的ID列表读取:1,3,2,3 而不是 1,3,2,4。以下是我的算法及print()命令的结果。我可以看到它在哪里出错,但无法弄清楚原因。您有什么想法吗?
def _getAvailableID(iD):
        i = iD
        f = open(IDFileName,"r")
        lines = f.readlines()
        for line in lines:
            print("%s,%s,%s"%("i=" + str(i), "ID=" + line[:-1], (str(i) == line[:-1])))
            if str(i) == line[:-1]:
                i += 1
                f.close()
                _getAvailableID(i)
        return str(i)

输出: (当算法运行以找到应该具有ID 4的记录的适当ID时的输出):

i=1,ID=1,True
i=2,ID=1,False
i=2,ID=3,False
i=2,ID=2,True
i=3,ID=1,False
i=3,ID=3,True
i=4,ID=1,False
i=4,ID=3,False
i=4,ID=2,False
i=4,ID=2,False
i=2,ID=3,False
i=2,ID=2,True
i=3,ID=1,False
i=3,ID=3,True
i=4,ID=1,False
i=4,ID=3,False
i=4,ID=2,False
i=4,ID=2,False

2
你必须使用递归函数吗?还是可以使用列表(或多个列表)或字典? - LinkBerest
2个回答

6
我认为你的程序失败是因为你需要更改以下内容:
_getAvailableID(i)

to

 return _getAvailableID(i)

目前递归函数找到的正确答案被丢弃了。

然而,更好的方法可能是将所有已经出现过的id放入一个集合中,以使程序更加高效。

例如,伪代码如下:

S = set()
loop over all items and S.add(int(line.rstrip()))
i = 0
while i in S:
   i += 1
return i

1
如果我放置 return _getAvailableID(i),它将返回到第一次调用 _getAvailableID(i),这违背了递归的目的,不是吗? - Kris Rice
1
对不起,你是正确的。现在它可以工作了,非常感谢 :) - Kris Rice

1

如果您只是想查找文件中的最大ID,然后返回下一个可用值:

def _getAvailableID(IDFileName):
    iD = '0'
    with open(IDFileName,"r") as f:
        for line in f:
            print("ID=%s, line=%s" % (iD, line))
            if line > iD:
                iD = line

    return str(int(iD)+1)

print(_getAvailableID("IDs.txt"))

使用一个包含输入文件的HTML文件。
1
3
2

它输出
ID=1, line=1

ID=1
, line=3

ID=3
, line=2

4

然而,我们可以用更具Python风格的方式来解决它:
def _getAvailableID(IDFileName):
    with open(IDFileName,"r") as f:
        mx_id = max(f, key=int)
    return int(mx_id)+1

1
是的,这是正确的。最小ID将始终为1。 - Kris Rice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接