Home
Accesso / Registrazione
 di 

Aiuto per una funzione ricorsiva

5 risposte [Ultimo post]
ritratto di Joe Psyter
Offline
Titolo: User
Utente
Ultima visita:
19 settimane 2 giorni fa
Utente dal: 19/04/2013
Messaggi: 5

Vorrei definire una funzione ricorsiva che riceve in ingresso due numeri x e y e ne restituisce le coordinate definibili dai due numeri . Ad esempio per x=4 e y=4 la funzione restituisce
4 4 , 3 4 , 2 4 , 1 4 ,
4 3 , 3 3 , 2 3 , 1 3 ,
4 2 , 3 2 , 2 2 , 1 2 ,
4 1 , 3 1 , 2 1 , 1 1 ,

Non importa il linguaggio con cui è scritta , potete anche scriverla in C , l'importante è che sia ricorsiva .

Grazie a chi mi risponde

ritratto di Piero Boccadoro
Offline
Titolo: Moderator
Moderatore
Ultima visita:
3 ore 44 min fa
Utente dal: 28/06/2011
Messaggi: 855
Utente PREMIUM
There you

There you go:

x=input('Inserisci la prima coordinata (ascisse) -> ');
y=input('Inserisci la seconda coordinata (ordinate) -> ');

for i=x+1:-1:1
for j=y+1:-1:1
S=horzcat(num2str(i), ' ', num2str(j));
C(i,j)=cellstr(S);
end
end

è uno script eseguibile in qualsiasi ambiente che utilizzi la funzione cellstr come Matlab, scilab, octave et simila ;)
L'output per x=6 e y=7 è questo:

C =

'1 1' '1 2' '1 3' '1 4' '1 5' '1 6' '1 7'
'2 1' '2 2' '2 3' '2 4' '2 5' '2 6' '2 7'
'3 1' '3 2' '3 3' '3 4' '3 5' '3 6' '3 7'
'4 1' '4 2' '4 3' '4 4' '4 5' '4 6' '4 7'
'5 1' '5 2' '5 3' '5 4' '5 5' '5 6' '5 7'
'6 1' '6 2' '6 3' '6 4' '6 5' '6 6' '6 7'

Dovrebbe essere quello che cercavi.
Se li vuoi ordinare diversamente (tu parti dal più alto e arrivi al valore più piccolo ma non ho capito perchè), basta invertire gli indici nei cicli for.

Saluti.

ritratto di delfino_curioso
Offline
Titolo: User++
Utente++
Ultima visita:
7 ore 49 min fa
Utente dal: 01/09/2012
Messaggi: 95
Utente PREMIUM
A meno di mia svista, credo

A meno di mia svista, credo che la soluzione di Piero, senz'altro efficace allo scopo finale, sia iterativa più che ricorsiva.
Se serve che la funzione sia necessariamente ricorsiva, dovresti definire un caso di base ed un passo induttivo.
A me era venuta in mente questa soluzione (pseudocodice in C):

printCoord(x,y)
{
  If y = 0 then exit;
  If x = 0 
        Then return x;
  Else
         Print (return [1+(printCoord(x-1,y)] , y);

  Print "\n";

  printCoord(x, y-1);

}

Nella singola riga il caso base si raggiunge quando x vale 0, mentre il passo induttivo prevede la stampa della coppia x ed y.
Terminata la fase in cui è la x a variare, si va accapo e si passa a far diminuire la y, ricominciando dal valore iniziale della x.

Non so se funziona, l'ho provata solo su carta.
Se la ricorsione non è necessaria, allora la soluzione proposta da Piero va benissimo; se ho interpretato male io, chiedo venia.
Ci terrei però a ricordare quanto detto nell'ultimo post di Emanuele sul blog, ovvero che il forum non dovrebbe essere preso per uno spazio dove si chiede di svolgere gli esercizi assegnati, quanto piuttosto un momento di scambio di informazioni, affinché ci sia una crescita personale di tutti i coinvolti.
Senza rancore ;-)
Ciao

ritratto di Piero Boccadoro
Offline
Titolo: Moderator
Moderatore
Ultima visita:
3 ore 44 min fa
Utente dal: 28/06/2011
Messaggi: 855
Utente PREMIUM
Hai ragione tu! La mia

Hai ragione tu!
La mia soluzione funziona ma è fuori traccia! :(
Scusate!

ritratto di Piero Boccadoro
Offline
Titolo: Moderator
Moderatore
Ultima visita:
3 ore 44 min fa
Utente dal: 28/06/2011
Messaggi: 855
Utente PREMIUM
Vabbè comuqnue al di là della

Vabbè comuqnue al di là della mia svista, facci sapere se sono queste le risposte che cercavi ;)

ritratto di Joe Psyter
Offline
Titolo: User
Utente
Ultima visita:
19 settimane 2 giorni fa
Utente dal: 19/04/2013
Messaggi: 5
Grazie per le risposte

Grazie per le risposte :)

Dopo aver scritto la domanda , mi sono accorto che nell'ambiente sul quale sto sviluppando il progetto potevo utilizzare anche il costrutto iterativo loop-for-count e non necessariamente la ricorsione .
Ecco , questa è la funzione che cercavo :

(deffunction defambiente
(?ascissa ?ordinata )
(loop-for-count ( ?x 1 ?ascissa) do
( loop-for-count (?y 1 ?ordinata) do
( assert ( ambiente ( casella (- (+( * ?ascissa ?x ) ?y) ?ascissa) ) ( ascissa ?x ) ( ordinata ?y ) ( volte_esplorata 0 ) ( materia vuoto ) ( automa nil ) (oggetto nil) ))
))
)

Grazie comunque per l'attenzione !

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 3 utenti e 57 visitatori collegati.

Ultimi Commenti