我必須找到給定范圍 x 和 y 之間所有偶數的總和。
我試過了:
def sum_even(x, y):
if x == y:
return x
else:
if x % 2 == 0:
return x sum_even(x 2, y)
如果我給定的范圍是 (5, 11),那么我的輸出應該是 24。
uj5u.com熱心網友回復:
試試這個:
def sum_even(x, y):
if x >= y:
return 0
if x % 2 == 0:
return x sum_even(x 1, y)
return sum_even(x 1, y)
例子:
>>> sum_even(5, 11)
24
>>> sum_even(2, 3)
2
>>> sum_even(2, 4)
2
>>> sum_even(2, 5)
6
我的代碼不包括總和中的上限 y (參見示例)。它可能是也可能不是所需的行為,但這取決于您的情況。如果要包括上限,請使用以下代碼:
def sum_even(x, y):
if x > y:
return 0
if x % 2 == 0:
return x sum_even(x 1, y)
return sum_even(x 1, y)
例子:
>>> sum_even(5, 11)
24
>>> sum_even(2, 3)
2
>>> sum_even(2, 4)
6
>>> sum_even(2, 5)
6
uj5u.com熱心網友回復:
您甚至可以使用 O(1) 解決方案來解決此問題。事實上,您不需要真正查看您范圍內的所有數字。你所需要的只是一個簡單的數學公式。例如,要將 0 到 10^10 的所有數字相加,您可以使用s = sum(x for x in range(10**10 1))(ie, s = sum(range(10**10 1))) 或使用著名的公式s = n * (n 1) // 2(ie, s = 10**10 * (10**10 1) // 2)。第二種方法要快得多,因為您不需要遍歷范圍內的所有數字。
同樣,在這種情況下,您可以這樣做:
def sum_even(x, y):
n1 = y // 2
n2 = (x - 1) // 2
return n1 * (n1 1) - n2 * (n2 1)
例子:
>>> sum_even(5, 11)
24
>>> sum_even(2, 3)
2
>>> sum_even(2, 4)
6
>>> sum_even(2, 5)
6
所以你不需要遞回,也不需要迭代來解決這個問題。只是一些數學:)
uj5u.com熱心網友回復:
這是您修補的解決方案,我認為它可能是正確的:
def sum_even(x, y):
if x == y or x == y-1:
return x
else:
if x % 2 == 0:
return x sum_even(x 2, y)
else:
return sum_even(x 1, y)
uj5u.com熱心網友回復:
我假設您想包括 x 和 y (如果它們是偶數)。例如,sum_even(2,6)將回傳2 4 6.
如果您想排除上限,下面的代碼片段需要稍作修正。
# Using python builtin functions `sum` and `range`:
def f1(x, y):
return sum(range(x x%2, y 1, 2))
# Using arithmetic:
def f2(x, y):
start, end = (x 1)//2, y//2
return end*(end 1) - start*(start-1)
# Using a `for`-loop:
def f3(x, y):
result = 0
for z in range(x, y 1):
if z % 2 == 0:
result = z
return result
# Using recursion:
def f4(x, y):
if x > y:
return 0
elif x % 2 == 1:
return f4(x 1, y)
else:
return x f4(x 2, y)
# Testing:
print(' x, y --> f1,f2,f3,f4')
for (x, y) in [(5,11), (0,10), (2,6), (12, 17)]:
results = [f(x,y) for f in (f1,f2,f3,f4)]
print('{:2d},{:2d} --> {:2d},{:2d},{:2d},{:2d}'.format(x,y,*results))
# x, y --> f1,f2,f3,f4
# 5,11 --> 24,24,24,24
# 0,10 --> 30,30,30,30
# 2, 6 --> 12,12,12,12
# 12,17 --> 42,42,42,42
uj5u.com熱心網友回復:
這是我的嘗試:
def sum_even(start, end):
if start == end:
return end*((start 1)%2)
else:
return start*((start 1)%2) sum_even(start 1,end)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/461011.html
上一篇:反轉串列的Python遞回函式
