Vinnaren i pepparkakshustävlingen!
2012-10-18, 14:41
  #1
Medlem
Pontsnuss avatar
Jag har stora svårigheter att förstå det logiska i vad som händer här. Om vi säger att jag vill skapa en FOR loop som ska beräkna:

fak(n) = n! = n × (n−1) × ... × 2 × 1

fak är alltså fakulteten för summan som ska beräknas.

Hur vill jag tänka, och hur ska jag koda?

Alternativt kan man tydligen göra detta med hjälp av rekursion där:

fak(n) = n! = n × (n−1)!
fak(1) = 1

! = fakultet

Hoppas det sitter någon matematiker som är van att arbeta i programmet

Mvh Pontus
Citera
2012-10-18, 14:43
  #2
Medlem
dMobergs avatar
Du vet inte hur många varv du kommer behöva loopa, då brukar man inte använda en for-loop. En (do) while-loop är nog mer vad du är ute efter.

Rekursion är ett snyggt sätt också ja. Har du nån aning hur du ska implementera det?
Citera
2012-10-18, 15:02
  #3
Medlem
yggdrazils avatar
Citat:
Ursprungligen postat av Pontsnus
Jag har stora svårigheter att förstå det logiska i vad som händer här. Om vi säger att jag vill skapa en FOR loop som ska beräkna:

fak(n) = n! = n × (n−1) × ... × 2 × 1

fak är alltså fakulteten för summan som ska beräknas.

Hur vill jag tänka, och hur ska jag koda?

Alternativt kan man tydligen göra detta med hjälp av rekursion där:

fak(n) = n! = n × (n−1)!
fak(1) = 1

! = fakultet

Hoppas det sitter någon matematiker som är van att arbeta i programmet

Mvh Pontus
Rent generellt ar forlopar inte matlabs forte. Rekursion ar helt klart mer elegant, och med tanke pa att matlab ar matlab ar det nog ett battre val. Du ska bara gora en metod eller vad det nu heter.

Ta in n
om n=0, returnera 1
Annars, returnera n*fak(n-1)

Busenkelt.
Citera
2012-10-18, 15:03
  #4
Medlem
Pontsnuss avatar
Om jag skriver såhär:

function asd = fak1(n)
asd = 1
for z=1:n

asd = asd*z

Det som händer är väl att jag definerar n i en input. Jag sparar alltså scriptet som fak1.m. När jag sedan skriver fak1(4) som input så kommer mitt script att ta 1. Sen gångra 1 med alla tal från 1 till n (som är 4) och sedan gångra dessa med varandra?

Hur skiljer sig detta från rekursion och vad är fördelarna med det senare?

EDIT: Är detta rimligt eller?

function svara = fak2(n)

if n == 1
svara = 1

elseif n*fak2(n-1)
__________________
Senast redigerad av Pontsnus 2012-10-18 kl. 15:19.
Citera
2012-10-18, 15:14
  #5
Medlem
Citat:
Ursprungligen postat av dMoberg
Du vet inte hur många varv du kommer behöva loopa, då brukar man inte använda en for-loop. En (do) while-loop är nog mer vad du är ute efter.

Rekursion är ett snyggt sätt också ja. Har du nån aning hur du ska implementera det?

Vad menar du med att han inte vet hur många gånger han ska loopa? han kommer ju loopa den n gånger. Så det är väl bara kör en forloop från 1 till n.

Kommer inte ihåg hur man gör funktioner i matlab, men inne i funktionen kommer det ju stå något liknande:
a=1
for i=0:1:n-1;
a = a*(n-i)
end
return

Men ja rekursion är ju rätt stiligt också =)
Citera
2012-10-18, 15:41
  #6
Medlem
Pontsnuss avatar
Löste det!

function svara = fak2(n)

if n == 1;
svara = 1;

else svara = n*fak2(n-1);

end

Tack för tipsen mina vänner!
Citera
2012-10-18, 18:07
  #7
Medlem
dMobergs avatar
Citat:
Ursprungligen postat av jackielackiesaki
Vad menar du med att han inte vet hur många gånger han ska loopa? han kommer ju loopa den n gånger. Så det är väl bara kör en forloop från 1 till n.

Kommer inte ihåg hur man gör funktioner i matlab, men inne i funktionen kommer det ju stå något liknande:
a=1
for i=0:1:n-1;
a = a*(n-i)
end
return

Men ja rekursion är ju rätt stiligt också =)
Haha jag vet inte hur jag tänkte riktigt, får man skylla på näringsbrist?
Citera
2012-10-18, 18:59
  #8
Medlem
pontusens avatar
factorial(n);

alternativt

prod(1:n);
Citera
2012-10-18, 19:23
  #9
Medlem
Citat:
Ursprungligen postat av dMoberg
Haha jag vet inte hur jag tänkte riktigt, får man skylla på näringsbrist?

Ja det får du, men vet inte om jag kommer tro på det

Men vi har alla våra stunder då tankarna flyter ifrån oss
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback