Forum

Nome Utente:
Password:
Riconoscimi automaticamente
 Tutti i Forum
 Laboratorio
 Bioinformatica e Biostatistica
 implementazione funzione fattoriale in R
 Nuova Discussione  Nuovo Sondaggio Nuovo Sondaggio
 Rispondi Aggiungi ai Preferiti Aggiungi ai Preferiti
Cerca nelle discussioni
I seguenti utenti stanno leggendo questo Forum Qui c'è:

Aggiungi Tag Aggiungi i tag

Quanto è utile/interessante questa discussione:

Autore Discussione  

Bian Que
Nuovo Arrivato



99 Messaggi

Inserito il - 26 gennaio 2011 : 23:07:04  Mostra Profilo  Visita l'Homepage di Bian Que Invia a Bian Que un Messaggio Privato  Rispondi Quotando
Salve a tutti non riesco a svolgere un esercizio di programmazione, spero che qualcuno mi dia una mano. L' esercizio chiede:
scrivere un programma che prende in input un numero intero (n) e mi restituisca come risultato il fattoriale di n.
esempio n=5 1*2*3*4*5=120


ho iniziato cosi'..non so se va bene e come continuare..

fattoriale<-function (n)
l<- c(1:n)
for (i in l)

qualcuno puo' darmi una mano
..grazie.

dallolio_gm
Moderatore


Prov.: Bo!
Città: Barcelona/Bologna


2445 Messaggi

Inserito il - 26 gennaio 2011 : 23:24:55  Mostra Profilo  Visita l'Homepage di dallolio_gm  Clicca per vedere l'indirizzo MSN di dallolio_gm Invia a dallolio_gm un Messaggio Privato  Rispondi Quotando
Ci sono diversi metodi per implementare una funzione per il calcolo del fattoriale. Probabilmente il prof ti ha chiesto di risolvere l'esercizio perchè vuole sapere se hai capito i diversi esempi di funzione ricorsiva o iterativa. Prima di continuare, ti conviene capire quale metodo il tuo prof vuole che tu implementi.

Il mio blog di bioinformatics (inglese): BioinfoBlog
Sono un po' lento a rispondere, posso tardare anche qualche giorno... ma abbiate fede! :-)
Torna all'inizio della Pagina

Bian Que
Nuovo Arrivato



99 Messaggi

Inserito il - 27 gennaio 2011 : 00:20:19  Mostra Profilo  Visita l'Homepage di Bian Que Invia a Bian Que un Messaggio Privato  Rispondi Quotando
grazie dallolio, il problema è che ho seguito il corso e ho studiato le slide facendo diversi esercizi tra quelli proposti, ma di funzione ricorsiva o iterativa non ho mai sentito parlare. Cioè a parte i fondamenti, quindi l' uso del if e del for il professore non ha spiegato altro.
Nessuno puo' darmi anche un input su come procedere ?
Torna all'inizio della Pagina

chick80
Moderatore

DNA

Città: Edinburgh


11491 Messaggi

Inserito il - 27 gennaio 2011 : 01:19:57  Mostra Profilo  Visita l'Homepage di chick80 Invia a chick80 un Messaggio Privato  Rispondi Quotando
Ci sono essenzialmente due modi di implementare una funzione fattoriale. Il modo ricorsivo e quello non ricorsivo.

Una funzione ricorsiva è una funzione che richiama sè stessa, ad es:


fatt <- function(x)
    {
    ifelse(x == 1, 1, x * fatt(x-1))
    }


In questo caso la funzione restituisce 1 quando viene passato 1 e x * fatt(x-1) quando viene passato un altro numero. Questo in pratica considera n! come: n! = n * (n-1)! = n * (n-1) * (n-2)! = .... = n * (n-1) * (n-2) * (n-3) * ... * 1

Lo svantaggio delle funzioni ricorsive è che carichi lo stack di chiamate alla stessa funzione e quindi per valori grandi la funzione può rallentare molto o addirittura fallire.

Il modo non ricorsivo è forse meno "elegante", ma usa semplicemente un ciclo for:


fatt <- function(n)
    {
    result <- 1;
    for (i in n:1)
        {
        result <- i * result
        }
    return(result)
    }

Sei un nuovo arrivato?
Leggi il regolamento del forum e presentati qui

My photo portfolio (now on G+!)
Torna all'inizio della Pagina

Glubus
Utente Junior

pinolo



156 Messaggi

Inserito il - 27 gennaio 2011 : 12:39:41  Mostra Profilo  Visita l'Homepage di Glubus Invia a Glubus un Messaggio Privato  Rispondi Quotando
#si potrebbe, senza loops e con un minimo di controllo
factorial2<-function(x)
{if (x<0) stop ("la funzione non accetta valori negativi")
if(x==0) x<-1
prod(1:x)}

factorial2(10)
factorial2(0)
factorial2(-2)

#oppure, usando la funzione gammma
factorial3<-function(x) gamma(x+1)
factorial3(10)

#meglio ancora utilizzare la funzione factorial che è già presente in R
factorial(10)


naturalmente per ogni utilizzo serio userei la funzione presente in R.

Stefano

Citazione:
Messaggio inserito da Bian Que

Salve a tutti non riesco a svolgere un esercizio di programmazione, spero che qualcuno mi dia una mano. L' esercizio chiede:
scrivere un programma che prende in input un numero intero (n) e mi restituisca come risultato il fattoriale di n.
esempio n=5 1*2*3*4*5=120


ho iniziato cosi'..non so se va bene e come continuare..

fattoriale<-function (n)
l<- c(1:n)
for (i in l)

qualcuno puo' darmi una mano
..grazie.


Torna all'inizio della Pagina

chick80
Moderatore

DNA

Città: Edinburgh


11491 Messaggi

Inserito il - 27 gennaio 2011 : 13:44:12  Mostra Profilo  Visita l'Homepage di chick80 Invia a chick80 un Messaggio Privato  Rispondi Quotando
In effetti in R è meglio usare altre strategie, come quelle che dice Glubus. Le due che spiegavo io sono quelle classicamente usate in linguaggi di più basso livello che però non si adattano bene a R.

Citazione:
#meglio ancora utilizzare la funzione factorial che è già presente in R

factorial chiama gamma, quindi è equivalente, anzi, hai addirittura un pochino più di overhead!

Ad ogni modo la differenza di tempo di calcolo è davvero minima tra tutte le varie funzioni se chiamate poche volte.

Piccolo test di velocità sul calcolo di 120! (ripetuto 100000 volte):

gamma > factorial > prod >> versione con for >>> versione ricorsiva

# chiamata diretta a gamma
> system.time(for(i in 1:100000){gamma(120+1)})
   user  system elapsed 
  0.128   0.000   0.128
# factorial
> system.time(for(i in 1:100000){factorial(120)})
   user  system elapsed 
  0.214   0.000   0.217 
# prod
> system.time(for(i in 1:100000){prod(1:120)})
   user  system elapsed 
  0.318   0.002   0.328 
# funzione con for
> system.time(for(i in 1:100000){fattFor(120)})
   user  system elapsed 
 12.836   0.004  12.960 
# funzione ricorsiva
> system.time(for(i in 1:100000){fattRec(120)})
   user  system elapsed 
377.686   0.343 381.382

Sei un nuovo arrivato?
Leggi il regolamento del forum e presentati qui

My photo portfolio (now on G+!)
Torna all'inizio della Pagina
  Discussione  

Quanto è utile/interessante questa discussione:

 Nuova Discussione  Nuovo Sondaggio Nuovo Sondaggio
 Rispondi Aggiungi ai Preferiti Aggiungi ai Preferiti
Cerca nelle discussioni
Vai a:
MolecularLab.it © 2003-18 MolecularLab.it Torna all'inizio della Pagina