Parametri pass-through in codice ricorsivo

1

Quando si scrivono grandi quantità di codice ricorsivo (per validi motivi), ho incontrato molti parametri che non sono usati in funzioni specifiche, ma sono ancora necessari per un sottoinsieme di tutte le funzioni.
IE questa situazione (a, b & c sono numeri):

function fun1(a, b, c) {
    if(a > b) {
        return fun2(a, b, c);
    } else if(b > c) {
        return fun3(a, b, c);
    } else {
        return a;
    }
}

function fun2(a, b, c) {
    return fun1(a + b, a - b, c);
}

function fun3(a, b, c) {
    return fun1(a * c, b, a / c);
}

(In realtà non so se questo termina)

In questo esempio, fun2 non utilizza mai effettivamente c , ma deve ancora richiedere c come parametro. In fun3 , questa è la stessa cosa ma per b e fun1 interessa solo a .

In questa situazione, cosa si dovrebbe fare per ridurre il numero di parametri fino ai soli parametri di cui ogni funzione ha bisogno e & non i parametri che vengono utilizzati in altre funzioni?

(Quando dico not used , intendo passato)

    
posta MrYurihi redstone 23.09.2018 - 22:57
fonte

2 risposte

4

Ti stai contraddicendo:

1

fun2 never actually uses c

2

function fun2(a, b, c) {
    return fun1(a + b, a - b, c);
}

Il passaggio di un parametro conta come se lo stesse usando. Stai pensando che non è utilizzato perché si tratta di chiamare fun1 , in un momento in cui anche fun1 è il metodo che ha chiamato fun2 in primo luogo.

Ma non è intrinsecamente il caso.

  • fun2 potrebbe utilizzare ADifferentMethod(c) internamente
  • fun2 potrebbe essere chiamato da AnotherCompletelyDifferentMethod()

In entrambi i casi, l'ipotesi che c sia "non utilizzata" non si attacca.

In questa struttura ricorsiva, il genitore fun1 e il child fun1 non dovrebbero essere etichettati come "la stessa funzione". Non sono. Ognuno di essi ha una propria esecuzione separata con un proprio ambito separato.

Proprio come due oggetti separati dello stesso tipo di classe non sono etichettati come "lo stesso oggetto"; due chiamate al metodo con lo stesso metodo non sono etichettate come "lo stesso metodo" (non in questo senso stai tentando di utilizzare, almeno).

    
risposta data 24.09.2018 - 08:10
fonte
1

Lo scenario comune per migliorare il numero di parametri è quello di astrarre una parte di essi all'interno di una classe o di una struttura che abbia senso.

Ad esempio, potremmo immaginare a , b e c in una classe nel tuo esempio e avere i seguenti metodi (codice python):

class MyClass:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def fun1(self):
        if(self.a > self.b)
            return self.fun2()
        elif(self.b > self.c)
            return self.fun3()
        return self.a

    def fun2(self):
        self.a = self.a + self.b
        self.b = self.a - self.b
        return self.fun1()

    def fun3(self):
        self.a = self.a * self.c
        self.c = self.a / self.c
        return self.fun1()

I metodi in se stessi possono utilizzare l'istanza dell'oggetto per impostare e passare gli argomenti. In questo schema non c'è bisogno di passare argomenti non modificati.

    
risposta data 26.09.2018 - 10:40
fonte

Leggi altre domande sui tag