我正在try 使用递归来查找列表中最大的数字. 我编写了一个程序,可以正确地运行,没有任何错误,但我想知道是否有更好的方法来纠正我的程序,同时仍然使用递归.

这是我的程序:

deff = -1
num1 = 0
num2 = 0
def closest(List):
    global deff, num1, num2
    deff1 = -1
    if deff == -1:
        deff = max(List) - min(List)
        deff1 = max(List) - min(List)
    if len(List) == 1:
        deff = -1
        return [num1, num2]
    if abs(List[0] - List[1]) <= deff:
        deff = abs(List[0] - List[1])
        num1 = List[0]
        num2 = List[1]
    return closest(List[1:])

这是我的Tester程序:


from recursion import *
allPassed = True

def closestMain():
    global allPassed    
    testCases = [(1, [3, 7, 67, 68, 210, 215], [67, 68]),
                 (2, [3, 7, 67, 168, 210, 215], [3, 7]),
                 (3, [3, 47, 67, 168, 210, 215], [210, 215]),
                 (4, [3, 7], [3, 7]),
                 (5, [3, 3, 3, 3, 3, 3], [3, 3]),
                 (6, [1, 2, 3, 4, 5, 6], [5, 6]),
                 (7, [5, 10, 100, 105, 305, 310], [305, 310]),
                 (8, [5, 10, 15], [10, 15])]
    
    for num, L, expected in testCases:
        result = closest(L)
        if result != expected:
            print(f'Closest Test {num} Failed. Expected {expected} got {result}')
            allPassed = False

def main():
    closestMain()
    if allPassed:
        print('All tests passed')

    
main()  

同样没有错误,程序运行得很好,只是试着看看是否有更好的方法使用递归来完成这项工作.

假设列表始终是排序的,并且长度始终大于或等于2

推荐答案

以下是我的try ,此算法适用于排序列表:

def closest(list_, close=None):
    if len(list_) < 2: return close
    if not close: return closest(list_[1:],list_[:2])
    a,b = list_[:2]
    x,y = close
    return closest(list_[1:], (a,b) if b-a <= y-x else (x,y))

Python相关问答推荐

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

Mistral模型为不同的输入文本生成相同的嵌入

log 1 p numpy的意外行为

无法定位元素错误404

Pre—Commit MyPy无法禁用非错误消息

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

Python避免mypy在相互引用中从另一个类重定义类时失败

Gekko中基于时间的间隔约束

将一个双框爆炸到另一个双框的范围内

Pandas 数据帧中的枚举,不能在枚举列上执行GROUP BY吗?

Python如何导入类的实例

SpaCy:Regex模式在基于规则的匹配器中不起作用

Polars表达式无法访问中间列创建表达式

将字节序列解码为Unicode字符串

PYTHON中的pd.wide_to_long比较慢

如何在Python中创建仅包含完整天数的月份的列表

大Pandas 中的群体交叉融合

有条件的滚动平均数(面试问题)

用考克斯回归的生存分析系列的真值是模棱两可的.