5 svar
66 visningar
Moni1 721
Postad: 7 mar 2021 12:19

det n som ger den längsta sekvensen, 'talserie'

hej, uppgiften går ut på att hitta 1<=n<=500 som ger längsta sekvensen. 

lgd=1; % den första talserien har längden 1
for n=2:500
n=t; varv=0;
while n ~= 1 % ty sista tal i serien ska vara 1, detta innebär att när vi får 1 så slutar loopen
if mod(n,2)==0 % om talet är jämnt
n=n/2; % dela talet med 2
else
n= n*3+1; % annars multiplicera med 3 och lägga till 1
end
varv=varv+1;
end
lgd(t)= varv;
end
[x,n]=max(lgd);
disp(n);

detta är koden från facit, men jag undrar på värför inför vi en variabel t, och värför kör inte koden om vi inte inför variabeln t, 

och vad står varv för.  tack på förhand

Sesan 3 – Fd. Medlem
Postad: 7 mar 2021 12:39

Hej!

 

Variabeln t införs för att veta vilket tal n du börjar att utföra sekvenskontrollen för. Eftersom n ändras inuti din while-slinga så har facit valt att spara ursprungliga n i variabeln t.

 

Variabeln varv ligger inuti while-slingan och återställs i början av for-slingan. Det är en räknare som håller koll på antalet gånger du upprepat while-slingan.

 

Hoppas att detta är till hjälp!

Moni1 721
Postad: 7 mar 2021 13:52

hej, och tack så mycket, men värför behover vi spara den ursprungliga n, 

och värför sätter vi då lgd(t)=varv. 

det visar sig att t sparas till 500, men om den urspungliga värdet av n blir sparat i t, skulle det inte vara 2 eller hur tänker man här. 

tack på förhand

Sesan 3 – Fd. Medlem
Postad: 7 mar 2021 16:21
suad skrev:

hej, och tack så mycket, men värför behover vi spara den ursprungliga n, 

och värför sätter vi då lgd(t)=varv. 

det visar sig att t sparas till 500, men om den urspungliga värdet av n blir sparat i t, skulle det inte vara 2 eller hur tänker man här. 

tack på förhand

Hej!

 

Ursäkta, jag var lite otydlig där. Det värdet som sparas i t är det ursprungliga värdet på n, för varje n som vill se sekvensen för (i det här fallet är det alla heltal mellan 2 och 500).

 

Att vi sätter lgd(t) = varv, betyder att index t i vektorn lgd innehåller antalet varv som while-slingan kör, och då alltså antalet tal i talserien. Det är alltså i lgd som längden på varje sekvens, för varje starttal t = n, sparas.

 

Exempel: Första varvet i for-slingan: n = 2, t = 2, varv = 0

  • Så länge som n inte är lika med ett (sant, n = 2):
  • Kontrollera om talet är jämnt (sant, n = 2):
    • Dela talet med två. Nu är n = 1, men t = 2.
  • Plussa på 1 på varv. varv = 1
  • Nytt varv börjar: nu är t = 2, n = 1 och varv = 1.  Eftersom n = 1 så kommer while-slingan att avslutas, och vi går ut till den yttre for-slingan istället.
  • Vi sätter lgd(t) = varv, som nu alltså är lgd(2) = 1.

Det betyder alltså att vi har sparat resultatet (1 tal/varv i serien) på plats nummer två (som var ursprungstalet) i vektorn lgd (längden på serien). Detta upprepas nu för n = 3,..., 500.

 

Hoppas att det tydliggör vad jag menade!

Laguna 28531
Postad: 7 mar 2021 17:35

Hur kan koden fungera när det står n=t? Jag tycker det borde vara t=n.

Sesan 3 – Fd. Medlem
Postad: 7 mar 2021 17:43 Redigerad: 7 mar 2021 17:47
Laguna skrev:

Hur kan koden fungera när det står n=t? Jag tycker det borde vara t=n.

Jag håller med. Missade det helt i mitt svar, den givna koden med n = t kan inte fungera.

Svara Avbryt
Close