Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Il più recente robot per la pulizia domestica di Dreame, modello Aqua10 Ultra Roller, abbina un potente motore di aspirazione della polvere a un sofisticato sistema di lavaggio con rullo integrato. Il tutto governato dalla logica di intelligenza artificiale, per i migliori risultati
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Siamo volati fino a Belfast, capitale dell'Irlanda Del Nord, per scoprire il nuovo Realme 15 Pro 5G Game Of Thrones Limited Edition. Una partnership coi fiocchi, quella tra Realme e HBO, un esercizio di stile davvero ben riuscito. Ma vi raccontiamo tutto nel nostro articolo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
Il Gigabyte Gaming A16 offre un buon equilibrio tra prestazioni e prezzo: con Core i7-13620H e RTX 5060 Laptop garantisce gaming fluido in Full HD/1440p e supporto DLSS 4. Display 165 Hz reattivo, buona autonomia e raffreddamento efficace; peccano però le USB e la qualità cromatica del pannello. Prezzo: circa 1200€.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-09-2011, 08:29   #1
Freaxxx
Senior Member
 
L'Avatar di Freaxxx
 
Iscritto dal: Dec 2006
Messaggi: 3808
[C] somma interi con ricorsione - migliorare programma già fatto

Codice:
#include <stdio.h>

int sommaTraInteri(int myA, int myB, int*, int*);

int main(){
    int mA=12;
    int mB=16;
    int sum=0;
    int cur=mA+1;
    printf("\n%d\n",sommaTraInteri(mA,mB,&sum,&cur));
}

int sommaTraInteri(int myA, int myB, int *sum, int *cur){
    if(*cur>myA && *cur<myB){
        *sum=*sum+*cur;
        *cur=*cur+1;
        sommaTraInteri(myA,myB,sum,cur);
    } else return *sum;
}
ho appena fatto questo programma che effettua la somma di tutti gli interi che si trovano tra i due interi passati alla funzione come argomento ( quindi non considera gli estremi nella somma ), il punto è che funziona perfettamente, ma non mi piace stilisticamente e per come è scritto, vorrei migliorarlo un po', ma sarà l'ora, ma non mi vengono molte idee, voi ne avete?
Freaxxx è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 09:09   #2
Kenger
Member
 
Iscritto dal: Aug 2005
Messaggi: 168
Codice PHP:
#include <stdio.h>

int sommaTraInteri(int myAint myBint);

int main(){
    
int mA=12;
    
int mB=16;
    
int cur=mA+1;
    
    
printf("\n%d\n",sommaTraInteri(mAmBcur));
}

int sommaTraInteri(int myAint myBint cur) {
    if(
cur>myA && cur<myB)
        return 
cur sommaTraInteri(myAmyBcur+1);

Spero non sia un qualche genere di compito
Kenger è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 09:20   #3
Freaxxx
Senior Member
 
L'Avatar di Freaxxx
 
Iscritto dal: Dec 2006
Messaggi: 3808
Quote:
Originariamente inviato da Kenger Guarda i messaggi
Codice PHP:
#include <stdio.h>

int sommaTraInteri(int myAint myBint);

int main(){
    
int mA=12;
    
int mB=16;
    
int cur=mA+1;
    
    
printf("\n%d\n",sommaTraInteri(mAmBcur));
}

int sommaTraInteri(int myAint myBint cur) {
    if(
cur>myA && cur<myB)
        return 
cur sommaTraInteri(myAmyBcur+1);

Spero non sia un qualche genere di compito
tranquillo che sono esercitazioni a caso che sto rabattando da internet giusto per fare qualcosa.

in pratica hai tolto il passaggio per riferimento e fatto un "trenino" di int con il return, sembra più corta in effetti ...

EDIT: il programma ha una logica errata, mi da un risultato sbagliato

Ultima modifica di Freaxxx : 05-09-2011 alle 09:33.
Freaxxx è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 09:50   #4
Kenger
Member
 
Iscritto dal: Aug 2005
Messaggi: 168
Puoi darmi qualche dettaglio in più? Con l'esempio 12-16 mi da 42 che è la risposta giusta se non ho capito male il problema.
Kenger è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 09:57   #5
Freaxxx
Senior Member
 
L'Avatar di Freaxxx
 
Iscritto dal: Dec 2006
Messaggi: 3808
Quote:
Originariamente inviato da Kenger Guarda i messaggi
Puoi darmi qualche dettaglio in più? Con l'esempio 12-16 mi da 42 che è la risposta giusta se non ho capito male il problema.
io ho controllato la logica e mi sembra corretta, ma il programma compilato sotto codeblocks mi da 58 come valore, preso pari pari e soltanto incollato e compilato.

non riesco a capire, provo a compilarlo "a mano" con gcc.
Freaxxx è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 10:01   #6
Freaxxx
Senior Member
 
L'Avatar di Freaxxx
 
Iscritto dal: Dec 2006
Messaggi: 3808
sempre 58 mi da.

edit: in pratica include nella somma anche l'estremo mB, il risultato dovrebbe essere 42, ma viene 58 cioé 42+16

Ultima modifica di Freaxxx : 05-09-2011 alle 10:04.
Freaxxx è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 10:06   #7
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12856
Codice:
int Summer( int a, int b )
{
   if (a>=b) return 0;
   if (b-a==1) return 0;
   if (b-a==2) return a+1;

   return a+1 + Summer(a+1, b);
}
Scritto al volo, non l'ho testato molto...
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 10:27   #8
Kenger
Member
 
Iscritto dal: Aug 2005
Messaggi: 168
Non ho codeblocks qua ma usando questo

http://codepad.org/txumHNmt

Mi dà il risultato giusto. Non sò che dire.
Kenger è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 10:46   #9
Kenger
Member
 
Iscritto dal: Aug 2005
Messaggi: 168
Prova così sennò.

Codice PHP:
int sommaTraInteri(int myAint myBint cur) { 
    if(
cur<=myA || cur>=myB
        return 
0;

    return 
cur sommaTraInteri(myAmyBcur+1); 

Kenger è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 13:40   #10
Freaxxx
Senior Member
 
L'Avatar di Freaxxx
 
Iscritto dal: Dec 2006
Messaggi: 3808
adesso installo linux da qualche parte e provo con altre versioni di gcc, ho paura che questo sia un bug ...
Freaxxx è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 14:10   #11
Freaxxx
Senior Member
 
L'Avatar di Freaxxx
 
Iscritto dal: Dec 2006
Messaggi: 3808
compilato sotto la beta1 attuale di Ubuntu

Codice:
tux@tux-VirtualBox:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6.1/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.1-7ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-7ubuntu2)
e sempre 58 mi da, inizio a pensare male di gcc
Freaxxx è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 14:49   #12
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
C'è da dire che la tua versione iniziale mi pare sia tail-recursive (involontariamente, credo), mentre le altre che ho visto successivamente mi pare non lo siano.
Io farei una roba tipo (se non ho scritto stronzate):
Codice:
#include <stdio.h>

int SumRangeAux(int a, int b, int accum) {
  return a >= b ? accum : SumRangeAux(a + 1, b, accum + a);
}

int SumRange(int a, int b) {
  return SumRangeAux(a + 1, b, 0);
}

int main() {
  int a = 12, b = 16;
  printf ("%d\n", SumRange(a, b));
  return 0;
}
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 18:17   #13
Kenger
Member
 
Iscritto dal: Aug 2005
Messaggi: 168
No, hai ragione, la mia non è tail-recursion. La soluzione iniziale immagino possa essere definita tail-recursion ma non usa minimamente la ricorsione, si passa direttamente il puntatore al risultato in giro. Non ha per niente senso così.

Se vuoi qualcosa con la tail-recursion l'unica cosa che mi viene in mente è
Codice PHP:
#include <stdio.h> 

int sommaTraInteri(int myBintint); 

int main(){ 
    
int mA=12
    
int mB=16
     
    
printf("\n%d\n",sommaTraInteri(mBmA+10)); 


int sommaTraInteri(int myBint curint tot) { 
    if(
cur>=myB
        return 
tot

    return 
sommaTraInterimyBcur+1tot cur); 

Almeno usi i valori di ritorno ma mi sembra abbastanza brutto.

La mia versione finale è:
Codice PHP:
#include <stdio.h> 

int sommaTraInteri(int myAint myB); 

int main(){ 
    
int mA=12
    
int mB=16
     
    
printf("\n%d\n",sommaTraInteri(mA+1mB)); 


int sommaTraInteri(int myAint myB) { 
    if(
myA==myB
        return 
0

    return 
myA sommaTraInterimyA myB ); 

Kenger è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2011, 20:28   #14
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
C'è una formula facile da ricordare che permette di sommarli senza ricorsione o cicli. Però tiene conto anche degli estremi quindi nel tuo caso ci si deve ricordare di aggiungere e sottrarre 1.
Codice:
#include <stdio.h>

int sum(int from, int to) {
	return ((to * to) - (from * from) + from + to) / 2;
}

int main(int argc, char** argv) {
	printf("%d", sum(12 + 1, 16 - 1));
}
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2011, 09:03   #15
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da Kenger Guarda i messaggi
Almeno usi i valori di ritorno ma mi sembra abbastanza brutto.
Sì beh non è tanto questione di bello o brutto. Sono due soluzioni molto diverse in termini di complessità di spazio, ed è bene conoscere questi aspetti, soprattutto se uno sta facendo esercizi per imparare.
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2011, 09:09   #16
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
Originariamente inviato da Kenger Guarda i messaggi
Puoi darmi qualche dettaglio in più? Con l'esempio 12-16 mi da 42 che è la risposta giusta se non ho capito male il problema.
EDIT : non ho letto bene
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2011, 09:14   #17
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
Originariamente inviato da Freaxxx Guarda i messaggi
tranquillo che sono esercitazioni a caso che sto rabattando da internet giusto per fare qualcosa.

in pratica hai tolto il passaggio per riferimento e fatto un "trenino" di int con il return, sembra più corta in effetti ...

EDIT: il programma ha una logica errata, mi da un risultato sbagliato
La logica è sbagliata almeno per un motivo : Nel caso "if" tu non ritorni un valore, infatti con capisco come faccia a funzionarti in alcuni casi (forse piglia qualcos'altro dallo stack ... che a volte potrebbe essere anche la cosa giusta o il registro EAX usato per il valore di ritorno viene usato anche per la somma e quindi rimane impostato all'uscita dell'ultima "sommaTraInteri" oppure ancora viene impostato dal return del caso else ...)

Codice:
#include <stdio.h>

int sommaTraInteri(int myA, int myB, int*, int*);

int main(){
    int mA=12;
    int mB=16;
    int sum=0;
    int cur=mA+1;
    printf("\n%d\n",sommaTraInteri(mA,mB,&sum,&cur));
}

int sommaTraInteri(int myA, int myB, int *sum, int *cur){
    if(*cur>myA && *cur<myB){
        *sum=*sum+*cur;
        *cur=*cur+1;
        sommaTraInteri(myA,myB,sum,cur);
    } else return *sum;
}
La linea in grassetto dovrebbe essere:
Codice:
 return sommaTraInteri(...blah) ;
__________________
GPU Compiler Engineer

Ultima modifica di AnonimoVeneziano : 06-09-2011 alle 09:22.
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2011, 11:11   #18
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12856
Quote:
Originariamente inviato da shinya Guarda i messaggi
Sì beh non è tanto questione di bello o brutto. Sono due soluzioni molto diverse in termini di complessità di spazio, ed è bene conoscere questi aspetti, soprattutto se uno sta facendo esercizi per imparare.
La cosa più importante prima è scrivere qualcosa di corretto, tail o no viene dopo, molto dopo.

Inoltre per come la vedo io, se devi scrivere codice tail-recursive, a meno che non ti venga naturale farlo, tantovale usare direttamente l'iterazione.

La via più naturale, per come la vedo io, è usare la ricorsione classica con lo stack delle chiamate, anche se questo può essere meno efficiente, ma secondo me è utile per capire bene il meccanismo.

Ultima modifica di WarDuck : 06-09-2011 alle 11:16.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2011, 13:28   #19
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
La cosa più importante prima è scrivere qualcosa di corretto, tail o no viene dopo, molto dopo.
Su questo non ci piove.
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Inoltre per come la vedo io, se devi scrivere codice tail-recursive, a meno che non ti venga naturale farlo, tantovale usare direttamente l'iterazione.

La via più naturale, per come la vedo io, è usare la ricorsione classica con lo stack delle chiamate, anche se questo può essere meno efficiente, ma secondo me è utile per capire bene il meccanismo.
No ma io non sto difendendo una soluzione piuttosto che un'altra. Dico solo che è bene sapere riconoscere e capire pro e contro di entrambi gli approcci. Altrimenti si finisce a calcolare fibonacci con complessità esponenziale solo perché "il prof. mi ha insegnato che la ricorsione è così".
E alla fine in termini pratici dipende dal linguaggio: in C usare la ricorsione in questo modo non è il modo idiomatico di esprimere questo algoritmo. In Haskell magari la situazione cambia... e allora è bene sapere la differenza tra i vari approcci e non solo avere "qualcosa che funziona".
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2011, 13:58   #20
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
Originariamente inviato da shinya Guarda i messaggi
In Haskell magari la situazione cambia... e allora è bene sapere la differenza tra i vari approcci e non solo avere "qualcosa che funziona".
Codice:
lol :: Int -> Int -> Int
lol a b | a < (b-1) = (a+1) + k
         | a >= b-1 = 0
         where k = lol (a+1) b

main = do
           putStrLn $ show $ lol 20 25
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo Dreame Aqua10 Ultra Roller, la pulizia di casa c...
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti Recensione Realme 15 Pro Game Of Thrones: un ver...
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Lapt...
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Sempre più vicino il lancio (e il...
L'incredibile ottimizzazione di Battlefi...
La NASA aprirà il contratto per i...
PS5 Pro CFI-7121: ecco tutte le differen...
SpaceX ha raggiunto il traguardo dei 10....
ROG Xbox Ally e Ally X sono care, ma il ...
Intesa Sanpaolo: stop all'app Mobile su ...
Gli USA costruiscono chip AI… ma non pos...
Grazie a Ericsson, l'italia è in ...
CMF by Nothing Buds 2a: ANC da 42 dB e o...
Il futuro di Porsche è ibrido: il...
Apple lancia i nuovi MacBook Pro e iPad ...
Free software e biologia: intervista al ...
Dongfeng Box bocciata da Euro NCAP: solo...
Parigi abbandona ufficialmente Eurodrone...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:33.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v