Wiem, jak dodawać rekurencyjnie liczby z listy
def mysum(L):
if not L:
return 0
else:
return L[0] + mysum(L[1:])
Czy możesz mi pomóc zbudować odejmowanie rekursywnie w ten sam sposób (tylko jedno wejście - Lista).
mydiff([10,1,2,3])
Wielkie dzięki
Odpowiedzi:
1 dla odpowiedzi № 1jeśli sekwencja jest (3,2,1)
, wynikiem jest 0. Ale odejmowanie idzie w odwrotnym kierunku, tj. 2 -1
niż 3 - (2-1)
Jeśli użyjesz return L[0] - mysum(L[1:])
.
Musimy więc użyć akumulatora, który zachowuje różnicę pierwszego i drugiego elementu sekwencji.
def mydiff(L, acc=None):
if not L:
return acc
else:
if acc is None:
acc = L[0] - L[1]
L = L[2:]
else:
acc -= L[0]
L = L[1:]
return mydiff(L, acc)
Bardziej prosty;
def mysub(seq, acc=None):
seq = iter(seq)
if acc is None:
item = next(seq, None)
if item is None:
return acc
acc = item
item = next(seq, None)
if item is None:
return acc
return mysub(seq, acc - item)
1 dla odpowiedzi nr 2
Obliczenie, które należy wykonać, to
>>> 10-(1+(2+(3+0)))
4
więc pierwszą operacją jest odejmowanie, alepozostałe operacje pozostają dodatkami. Myślę, że musisz użyć funkcji wewnętrznej, jeśli nie możesz dodać drugiego parametru do głównej funkcji:
def mydiff(L):
def sub(L, first=False):
if not L:
return 0
else:
if first:
return L[0] - sub(L[1:])
else:
return L[0] + sub(L[1:])
return sub(L, True)
Testowanie:
>>> mydiff([10,1,2,3])
4