Skurupu Skrevet 23. februar 2006 Del Skrevet 23. februar 2006 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
qualbeen Skrevet 23. februar 2006 Del Skrevet 23. februar 2006 (endret) 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 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 23. februar 2006 av qualbeen Lenke til kommentar
Skurupu Skrevet 23. februar 2006 Forfatter Del Skrevet 23. februar 2006 (endret) Ser ut til å fungere bra dette. Skal poste den ferdige koden etter hvert. Endret 23. februar 2006 av Skurupu Lenke til kommentar
Skurupu Skrevet 23. februar 2006 Forfatter Del Skrevet 23. februar 2006 (endret) 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 23. februar 2006 av Skurupu Lenke til kommentar
Skurupu Skrevet 23. februar 2006 Forfatter Del Skrevet 23. februar 2006 (endret) 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 23. februar 2006 av Skurupu Lenke til kommentar
qualbeen Skrevet 23. februar 2006 Del Skrevet 23. februar 2006 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
Peter Skrevet 23. februar 2006 Del Skrevet 23. februar 2006 (endret) Den fakultetkoden din skal helt sikkert skrives som: public int fac(int n) { if(n > 1) return n*fac(n-1); else return 1; } (eller noe i den duren) Endret 23. februar 2006 av Nazgul Lenke til kommentar
Orjanp Skrevet 24. februar 2006 Del Skrevet 24. februar 2006 Det spørs vel om rekusjon er tatt opp ennå. Ørjan... Lenke til kommentar
elminzter Skrevet 24. februar 2006 Del Skrevet 24. februar 2006 public static int fakultet(int n) { if (n>0) { return (n==1 ? n*1 : n*fakultet(n-1)); } return 0; } Lenke til kommentar
Peter Skrevet 24. februar 2006 Del Skrevet 24. februar 2006 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. Lenke til kommentar
mikaelandre Skrevet 24. februar 2006 Del Skrevet 24. februar 2006 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå