Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Con un prezzo di 2.999 euro, il Panasonic Z95BEG entra nella fascia ultra-premium dei TV OLED: pannello Primary RGB Tandem, sistema di raffreddamento ThermalFlow, audio Technics integrato e funzioni gaming avanzate lo pongono come un punto di riferimento
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
Abbiamo provato per diverse settimane il nuovo Magic V5 di HONOR, uno smartphone pieghevole che ci ha davvero stupito. Il device è il più sottile (solo 4.1mm) ma non gli manca praticamente nulla. Potenza garantita dallo Snapdragon 8 Elite, fotocamere di ottima qualità e batteria in silicio-carbonio che garantisce un'ottima autonomia. E il Prezzo? Vi diciamo tutto nella nostra recensione completa.
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: 12840
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: 12840
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


Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico Lenovo IdeaPad Slim 3: un notebook Snapdragon X ...
Il prossimo top di gamma di Vivo sarà il...
Sony mostra in anteprima la propria tecn...
Dreame A3 AWD: a IFA 2025 debutta il rob...
OpenAI, il chip proprietario per l'AI &e...
OnePlus e Hasselblad si separano: una nu...
Ayaneo Pocket Air Mini: la retro console...
Amazon sfida tutti: crollano iPhone e Ma...
MacBook Pro con chip M4 a 1.649€ e MacBo...
Dreame a IFA 2025: robot capaci di salir...
AirPods 4 contro AirPods Pro 2: Amazon l...
Amazon in furore da sconti: tutti gli iP...
RTX Hair in Indiana Jones e l'Antico Cer...
Robot aspirapolvere super scontati su Am...
Windows Mixed Reality: un ingegnere Micr...
Qualcomm: Intel non è ancora pron...
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: 07:24.


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