18 svar
136 visningar
Moni1 721
Postad: 12 mar 2021 15:11

rekursivt funktion

hej, när jag skrivar denna koden på matlab får jag att (Error in mindec2bin (line 12),bin = [mindec2bin(floor(dec/2)) bit];) . och jag undrar på vad är fel med koden, och värför infogar vi det logiska värdet bit=true;

uppgiften säger: skriv en rekursiv funktion som givet ett heltal på decimalform beräknar och returnerar den binära representationen av talet som ett logiskt fält. där true motsvarar
en etta och false en nolla.

function bin = mindec2bin(dec)
if dec == 0
    bin=false;
elseif dec == 1
    bin = true;
else
    bit=true;
    if mod(dec,2)==0
        bit=false;
         end
   end
bin = [mindec2bin(floor(dec/2)), bit];
end
Laguna Online 28531
Postad: 12 mar 2021 17:31

Du säger att du skriver koden, och sen att du undrar varför 'bit' finns där.

Hur mycket har du skrivit själv av den?

Moni1 721
Postad: 12 mar 2021 18:28

hej, igen, med att skriva mener jag att jag kör den på matlab 

Moni1 721
Postad: 12 mar 2021 18:35

men alltså jag förstår att 

if dec == 0 betyder om heltalen är noll  så ska den logiska functionen returnera false, 

elseif dec == 1, om vi har heltalen 1 returnerar funktionen true. 

men sedan förstår jag inte värför inför de i facit bit- delen, men gällende 

if mod(dec,2)==0 % dvs om divisionen går jämnt upp så returnerar funktionen false. 

till slut bin= [mindec2bin(floor(dec/2)), bit] betyder att funktionen ska skriva ut [ värdet av mindec2bin(avrundet värde av(dec/2), logiskt värde av bit]

Laguna Online 28531
Postad: 12 mar 2021 21:47

Näst sista och näst näst sista raderna verkar ha blivit omkastade. 

Moni1 721
Postad: 13 mar 2021 09:27

hej igen nu har jag ändrat på dem, ser det rätt ut, men värför infogar dem vektorn bit. 

function bin = mindec2bin(dec) % en funktion som omvandlar mellan decimal tal till binär tal.
if dec == 0 % om decimaltalet är noll returnera false.
    bin=false;
elseif dec == 1 
    bin = true;
else
    bit=true;
    if mod(dec,2)==0
        bit=false;
    end
   bin = [mindec2bin(floor(dec/2)), bit];
    
       end
end
Moni1 721
Postad: 13 mar 2021 09:56

eller kan vi till exempel använda ett annat kod. 

Laguna Online 28531
Postad: 13 mar 2021 10:06

bit är lägsta biten i talet, 0 eller 1. Vi tar reda på den, anropar mindec2bin på resten av talet och lägger sen vår bit sist.

Varför inte provköra?

Moni1 721
Postad: 13 mar 2021 10:46

hej, jag har provköret mindec2bin(10) och fick  1 0 1 0, så detta ser rätt ut. 

Moni1 721
Postad: 13 mar 2021 10:49

så med bit, menar dom att om sista biten är noll så ska funktionen returnera false då 0/2  ger rest noll efter division, och 

om sista biten är 1 så returnerar funktionen true, eftersom 1/2 ger resten 1 efter division. 

Laguna Online 28531
Postad: 13 mar 2021 11:04

Om talet är större än 1 så returnerar funktionen inte true eller false utan en lista som den sätter ihop med bit (lägsta biten) sist.

Moni1 721
Postad: 13 mar 2021 11:19

hej, igen, menar du att  denna raden 'bin = [mindec2bin(floor(dec/2)), bit];' betyder att om talet är större än ett så ska funktionen returnera en lista som den sätter ihop med lägsta biten sist. 

Laguna Online 28531
Postad: 13 mar 2021 11:46

Nej, raderna i början av funktionen tar hand om fallen 0 och 1.

Moni1 721
Postad: 13 mar 2021 13:55

men vilken rad tar hand om fallen som är större än ett, är det de radene som börjar på bit=true

Laguna Online 28531
Postad: 13 mar 2021 16:18

Talet heter 'dec' och man testar först om det är 0 och sedan om det är 1.

Moni1 721
Postad: 13 mar 2021 17:54

hej, igen, detta betyder att dessa raderna tar reda på lägsta biten i talet. 

else
    bit=true;
    if mod(dec,2)==0
        bit=false;
         end
Moni1 721
Postad: 13 mar 2021 17:57

och med denna raden 

bin = [mindec2bin(floor(dec/2)), bit];

anropar vi mindec2bin på resten av talet och lägger sen vår bit sist. 

dvs när vi anropar mindec2bin på resten av talet körs funktionen på nytt. 

Laguna Online 28531
Postad: 13 mar 2021 17:59

Ja, den anropar sig själv för att göra resten av jobbet. 

Moni1 721
Postad: 13 mar 2021 18:10

tack så mycket nu forstår jag bättre

Svara Avbryt
Close