Sento che mi manca qualcosa di ovvio. Scomporre una lista in testa e coda e poi ricorrere sulla coda è una tecnica di programmazione funzionale standard, eppure sto cercando di farlo per i tipi Sliceable
in Swift.Ricorsione su Swift Sliceable
Ho una funzione ricorsiva che segue questo schema:
func recurseArray(arr: [Int]) -> [Int] {
guard let first = arr.first else {
return []
}
let rest = recurseArray(Array(dropFirst(arr)))
let next = rest.first ?? 0
return [first + next] + rest
}
Ovviamente il codice vero e proprio fa molto di più che aggiungere ogni numero a quello successivo.
Nota la chiamata a Array(dropFirst(seq))
. La conversione in un array è richiesta poiché dropFirst
restituisce effettivamente un ArraySlice
e un ArraySlice
non è un Sliceable
, quindi non posso passarlo alla mia funzione.
Non sono sicuro del tipo di ottimizzazione che il compilatore è in grado di eseguire qui, ma mi sembra che la creazione di un nuovo array da un SubSlice
non sia necessariamente ottimale. c'è una soluzione a questo?
Inoltre, quello che mi piacerebbe davvero piace fare è creare una versione di questa funzione che può assumere qualsiasi Sliceable
tipo:
func recurseSeq<T: Sliceable where T.Generator.Element == Int>(list: T) -> [Int] {
guard let first = list.first else {
return []
}
let rest = recurseSeq(dropFirst(list)) // <- Error - cannot invoke with argument type T.SubSlice
let next = rest.first ?? 0
return [first + next] + rest
}
Questa volta non ho una soluzione al Infatti ho un SubSlice
. Come posso raggiungere il mio obiettivo?
Quindi ero almeno in parte sulla giusta pista :) - Potresti aggiungere un link al post sul forum devoper? –
OK, ma dal momento che devi essere uno sviluppatore, non sono sicuro che sia utile per il pubblico generale. – tarmes
Suppongo che molte delle persone attive nel tag [swift] abbiano un account sviluppatore Apple. –