Controllo del flusso in Go senza ciclo for

1

Sono stato impostato per una sfida che sto cercando di mettere alla prova, ma sto lottando con il modo migliore (o "corretto") per implementarlo. La sfida consiste nel creare una semplice app per console scritta in Go che calcoli la somma dei quadrati di n numeri. Tuttavia, devo farlo senza utilizzare un ciclo for e solo la libreria standard.

Non avendo mai toccato Go prima di questo punto, ho pensato che sarebbe stato solo un caso di usare un ciclo while , ma dopo aver scavato nei documenti so che la funzionalità in Go è stata piegata nell'istruzione for . Non c'è fortuna allora.

So anche che Go implementa le dichiarazioni di goto che sembrano essere un'opzione, ma nei miei ~ 2 anni di programmazione, mi è stato insegnato ad evitarli come la peste perché sono una "forma terribile" e sono solo appese in giro per alcuni casi specifici, quindi non posso immaginare che questa sfida mi stia cercando di trovare una dichiarazione goto .

Pur sapendo che Go ha alcune funzionalità di controllo di flusso più complesse che non ho menzionato, non ho trovato nulla di ovvio in grado di replicare la funzionalità che otterrei da un semplice ciclo for .

Ciò che concettualmente può replicare un ciclo for in go?

    
posta Hexodus 29.03.2016 - 14:51
fonte

3 risposte

5

Solitamente sfide come questa sono pensate per testare o insegnarti gli idiomi unici di una lingua o la sua libreria standard. Di solito la risposta sarebbe abbastanza breve, elegante, o almeno intelligente se fatta "correttamente" ma altrimenti noiosa e brutta. Ad esempio, questo problema risolto in Scala idiomatica è:

input.map(x => x*x).sum

Pertanto, starei lontano dalle soluzioni, come "usa la ricorsione", che sono applicabili a qualsiasi lingua, e cerco cose uniche, come canali e goroutine, e continuiamo a raffinare la tua soluzione finché non è facile da capire come un ciclo for, purché tu abbia familiarità con la lingua. Allora avrai imparato un po 'su come usare Vai al suo miglior vantaggio.

    
risposta data 29.03.2016 - 19:17
fonte
2

Non ho familiarità con Go come lingua, ma l'ho verificato brevemente e supporta Recursion . Se la tua lingua supporta la ricorsione ( e la maggior parte di ), puoi implementare il comportamento di loop senza mai usare esplicitamente un ciclo.

La ricorsione viene eseguita quando una funzione effettua una chiamata a se stessa, di solito operando su qualche sottoinsieme dei dati originali passati. Usando lo pseudocodice, è possibile calcolare le somme dei quadrati di un elenco di numeri in questo modo:

def calculateSquareSums (values : [Int]):
  if values is empty: // This is our 'base case' - it stops the function from recursing
    return 0
  else:
    square : Int = values[0] * values[0]       // Get the square of the first value
    rest : [Int] = values[1..]                 // Get the remaining values
    return square + calculateSquareSums(rest)  // Recursively call this function to process the remaining values

Se dovessi passare a questa funzione un elenco di valori, ad esempio [7, 5, 8, 2] , si comporterebbe come se fosse stato espanso a ((7*7) + ((5*5) + ((8*8) + ((2*2) + 0)))) .

La ricorsione è un concetto estremamente potente che ha molte applicazioni, specialmente negli algoritmi di tipo divide e conquista. Tuttavia, presenta alcuni aspetti negativi e disposizioni a seconda della lingua che stai utilizzando.

  • In molte lingue, ogni chiamata ricorsiva spinge un nuovo Frame di stack, il che significa che le funzioni ricorsive che hanno molte chiamate possono causare un'eccezione di overflow dello stack. Alcune lingue possono ottimizzarlo per alcuni casi.
  • Le funzioni ricorsive possono essere più difficili da comprendere rispetto ai loop semplici, poiché devi mentalmente tenere traccia dello stato di ogni chiamata.
risposta data 29.03.2016 - 15:41
fonte
1

Non conosco la lingua Go.

Se c'è o se puoi creare una funzione in Go che è l'equivalente di setInterval e clearInterval di JavaScript, allora è possibile trovare la somma dei quadrati di n numeri che li usano invece di usare qualsiasi tipo di costrutto for-loop . Non so se questa è la soluzione migliore. Comunque è una soluzione che accetterei.

Se si ha accesso a una libreria dell'interfaccia utente all'interno della lingua Go, è anche possibile trovare la somma dei quadrati di n numero utilizzando gli eventi attivati dall'utente tramite clic del mouse o della tastiera. Per ogni clic, il quadrato di un numero viene aggiunto a un totale parziale.

La ricorsione sarebbe un altro modo di calcolare la somma dei quadrati di n numeri. Tuttavia se ogni chiamata di funzione include un'allocazione dinamica della memoria del computer, la ricorsione sarebbe una scelta scadente quando n è grande.

Come dimostrazione, ho creato un'app basata su moduli invece di un'app basata su console. L'app utilizza le funzioni setInterval e clearInterval di JavaScript. Un campo di testo di input viene utilizzato per inserire la matrice di numeri da elaborare. Un altro campo di testo viene utilizzato per visualizzare la somma. Se sei interessato, l'app è un diagramma dinamico e interattivo nel seguente documento PDF: link .

    
risposta data 02.04.2016 - 16:55
fonte

Leggi altre domande sui tag