如何修复我的代码?使用递归,返回一个包含所有k的列表,这样3≤ K≤ n和k可以被3或5整除,但不能同时被2整除?

2024-04-20 00:41:08 发布

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

因此,我正在复习我的类,正如标题所示,我试图从递归函数返回一个列表,其中包含可被3或5整除的正值,但不能同时包含这两个值。例如,div_by_3_xor_5(20)应该返回[3, 5, 9, 10, 12, 18, 20],其中15缺失,因为它可以被3和5整除

我找出递归解决方案的方法通常是首先将其作为常规循环编写,然后查看需要调整哪些内容才能将其转换为递归函数。此函数的常规循环函数非常简单:

def div_by_3_xor_5(n):
    a_list = []
    for i in range(3, n + 1):
        div_by_3 = (i % 3 == 0)
        div_by_5 = (i % 5 == 0)
        
        if div_by_3 and div_by_5:
            pass
        elif div_by_3 or div_by_5:
            a_list.append(i)
    return a_list

# correct output for div_by_3_xor_5(20): [3, 5, 9, 10, 12, 18, 20]

我曾尝试将其转换为递归函数,但输出错误

def div_by_3_xor_5(n, k = 3):
    if k >= n:
        return [n]
    
    for i in range(k, n + 1):
        div_by_3 = (i % 3 == 0)
        div_by_5 = (i % 5 == 0)
        
        if div_by_3 and div_by_5:
            pass
        elif div_by_3 or div_by_5:
            return [i] + div_by_3_xor_5(n, k + 1)
    
# incorrect output for div_by_3_xor_5(20): 
# [3, 5, 5, 6, 9, 9, 9, 10, 12, 12, 18, 18, 18, 18, 18, 18, 20, 20]

有谁能帮我找出哪里出了问题,让我返回[3, 5, 6, 9, 10, 12, 18, 20]


2条回答

每次你都需要让递归作用于问题的一小部分

这里是一种分而治之的递归形式,尽管在我看来,强制将递归适应到这个需求中是一种真正的延伸

def wacky_numbers(hi, lo=3):
    if hi == lo:
        test3 = lo%3 == 0
        test5 = lo%5 == 0
        if test3 != test5:
            return [lo]
        else:
            return []
    else:
        mid = (hi+1+lo)//2
        return wacky_numbers(mid-1,lo) + wacky_numbers(hi,mid)

为了获得额外的保护,您可能需要测试hi<lo

def div_by_3_xor_5(n, k = 3):
    if k >= n:
        return [n]
    
    div_by_3 = (k % 3 == 0)
    div_by_5 = (k % 5 == 0)
        
    if div_by_3 and div_by_5:
        return div_by_3_xor_5(n, k + 1)
    elif div_by_3 or div_by_5:
        return [k] + div_by_3_xor_5(n, k + 1)
    else:
        return div_by_3_xor_5(n, k + 1)

# output of div_by_3_xor_5(20) was correct: [3, 5, 6, 9, 10, 12, 18, 20]

多亏了卡尔的评论,我又看了一遍我的代码才明白。我试图在不可被3或5整除的整数上循环,但我可以通过递归调用下一个整数来实现。谢谢你,卡尔

相关问题 更多 >