/ / Odejmowanie (lista) rekurencyjnie w Pythonie 3 - python-3.x, rekursja

Odejmowanie (lista) rekurencyjnie w Pythonie 3 - python-3.x, rekursja

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 № 1

jeś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