[英]Calculating combinations of length k from a list of length n using recursion
[英]How can I fix my code? Using recursion, return a list containing all k such that 3 ≤ k ≤ n and k is divisible by 3 or 5 but not both?
所以我正在审查我的 class,正如标题所示,我试图从递归 function 返回一个列表,其中包括可被 3 或 5 整除但不能同时被整除的正值。 因此,例如, div_by_3_xor_5(20)
应该返回[3, 5, 9, 10, 12, 18, 20]
,缺少15
因为它可以被 3 和 5 整除。
我找出递归解决方案的方法通常是先把它写成一个常规循环,然后看看我需要调整什么来把它变成一个递归 function。 这个的常规循环 function 很简单:
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]
我尝试将其转换为递归 function 但 output 是错误的。
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]
吗?
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]
感谢 Karl 的评论,我在再次查看我的代码后发现了这一点。 我试图遍历不能被 3 或 5 整除的整数,但我可以通过递归调用下一个 integer 来做到这一点。 谢谢卡尔!
您每次都需要以某种方式使递归作用于问题的一小部分。
这是一种分而治之的递归形式,尽管在我看来,将递归强制适应此要求是一个真正的延伸。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.