Quindi sto provando a scrivere una funzione python che accetta due argomenti, n e num e conta le occorrenze di 'n' tra 0 e num. ad esempio,Conteggio occorrenze di cifre 'x' nel campo (0, n]
countOccurrences(15,5)
dovrebbero essere 2
countOccurrences(100,5)
dovrebbe essere 20
ho fatto una semplice soluzione iterativa a questo problema:..
def countOccurrences(num,n):
count=0
for x in range(0,num+1):
count += countHelper(str(x),n)
return count
def countHelper(number,n):
count=0
for digit in number:
if digit==n:
count += 1
return count
Questo si è verificato in problemi evidenti se ho provato a chiamare countOccurrences(100000000000,5)
. La mia domanda è: come posso renderlo più efficiente? Voglio essere in grado di gestire il problema "abbastanza" velocemente ed evitare errori di memoria insufficiente. Ecco il mio primo passaggio ad una soluzione ricorsiva cercando di fare questo:
def countOccurence(num, n):
if num[0]==n:
return 1
else:
if len(num) > 1:
return countOccurence(num[1:],n) + countOccurence(str((int(num)-1)),n)
else:
return 0
Se questo è Python 2.x, utilizzare 'xrange'. La ricorsione significa semplicemente che hai raggiunto il limite di ricorsione del sistema. – jonrsharpe
Credo che la soluzione corretta sia probabilmente molto più intelligente di questa. Immagino che questo possa essere fatto in O (log n) se non in O (1). – Kevin
Sono d'accordo con altri Kevin. Ricordo di aver visto questa domanda in un sito di sfida di programmazione (Project Euler ???), e la soluzione era ricorsiva e logaritmica. – Kevin