Gå til innhold

En metode som kan regne ut "n fakultet"


Anbefalte innlegg

Jeg har fått i oppgave å lage en slik metode, men jeg sliter skikkelig. Jeg har ikke studert java mer en noen få uker, og ikke veldig aktivt. Oppgaven lyder som følger:

 

Skriv en metode som multipliserer alle tallene fra 1 til n. Dette kalles å beregne "n fakultet" og skrives n!, for eksempel vil 4! = 4*3*2*1=24. Ved kjøring skal brukeren bli bedt om å oppgi et heltall n, deretter skal programmet skrive ut:

 

          n! = <verdi fra utregningen>

 

Eksempel på utskrift:

 

5! = 120

 

Jeg er ikke ute etter å få dette ferdig skrevet for meg, men det hadde vært fint om noen kunne i hvert fall peke meg i riktig retning. Jeg har prøvd meg frem med noen for- og while-løkker, men jeg er ikke sikker på om det er riktig fremgangsmåte.

 

Takker for alle svar.

Lenke til kommentar
Videoannonse
Annonse

int n = 5 //endre til innlest tall
int temp = 1;
while(n>1){
   temp *=n;
   n--;
}
System.out.println(temp);

 

Dette burde vel fungere sånn passelig...? Har kun brukt 20 sekunder på å tenke ut svar, så kan godt hende det ikke fungerer alt for bra :p

 

Edit: temp-ens startverdi må være 1 siden det her er snakk om ganging. Og du bør ta en sjekk om brukeren oppgir ugyldige verdier (n < 1)

Endret av qualbeen
Lenke til kommentar

Slik ble den ferdige koden:

 

import easyIO.*;

class oppgave1 {
   public static void main (String[]args) {
In tastatur = new In();
System.out.println("Oppgi et heltall:");
int n;
n = tastatur.inInt();
int a = n;
int x = 1;

while (n>1) {
   x *=n;
   n--;
}
System.out.println(a + "! = " + x);
   }
}

Edit: Den ser egentlig mye finere ut, men forumet liker å venstrejustere tekst.

 

Jeg måtte skifte den litt, da din versjon alltid printet ut "1! = <x>". Fordi verdien til n hadde sunket til 1 i løpet av while-løkken.

 

Tusen takk for hjelpen, jeg hadde ikke klart det uten deg.

Endret av Skurupu
Lenke til kommentar

Nytt problem som går på nesten det samme:

 

Skriv en metode som adderer tallene fra 1 til n (n ukjent) inntil summen er større eller lik en verdi oppgitt av brukeren. Når metoden kjøres skal brukeren bli spurt om å oppgi en maksimal verdi. Programmet skal så skrive ut setningen:

 

Summen av 1, 2, 3 ..., <n> er <sum> som er større eller lik <maksverdi>.

 

Eksempel på utsrift:

 

Oppgi en verdi større enn 10:

11

 

Summen av 1, 2, 3, ..., 5 er 15 som er større eller lik 11.

 

Jeg trur at en while-løkke er rette veien til mål her, men jeg klarer det rett og slett ikke. Problemet ligger i det at maksverdien skal overgås, men med så lite som mulig. Jeg har ikke helt tankegangen i orden her.

Endret av Skurupu
Lenke til kommentar

blir vel egentlig samme opplegg som i stad:

int innlestTall = 11;
int temp = 0;
int i = 1
while (temp <= innlestTall){
   temp +=i;
   i++;
}
System.out.println(temp);

Eventuelt går det sikkert an å bruke en for-løkke:

int innltestTall = 11;
int temp=0;
for (int i =0; temp <= innlestTall; i++){
  temp +=i;
}
System.out.println(temp);

Selv synes jeg for-løkken er mest elegant. Men det blir vel smak og behag.

Lenke til kommentar
	public static int fakultet(int n) {
    if (n>0) {
        return (n==1 ? n*1 : n*fakultet(n-1));
    }
    return 0;
}

5658360[/snapback]

 

 

Det var en veldig merkelig kode.

om n==1, så gang 1 med 1.

og dersom n <= 0, noe den aldri kan bli med den koden, returner 0.

5658777[/snapback]

 

n er mindre enn 0 dersom du sender et negativt tall til metoden. Det er god praksis å sikre at metoden returnerer uansett input.

 

Ellers så er det så vidt jeg husker ikke så lurt å bruke rekursjon til å regne ut fakultet. Det er kun et problem med store tall, men du vil hele tiden legge ting på stakken, og du tar ikke bort noe før du er kommet ned til 1. Det gjør at metoden bruker mye mer minne enn ved ei løkke, og det går heller ikke så veldig fort. Eneste grunnen til at man bruker rekursjon til dette på skoler er fordi det er en enkel måte å vise prinsippet med rekursjon. Dette kan lett testes ved å skrive en slik metode, og se på ressursbruken når den kjøres.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...