18 svar
57 visningar
suad 513
Postad: 12 mar 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 14271
Postad: 12 mar 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?

suad 513
Postad: 12 mar 18:28

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

suad 513
Postad: 12 mar 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 14271
Postad: 12 mar 21:47

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

suad 513
Postad: 13 mar 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
suad 513
Postad: 13 mar 09:56

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

Laguna 14271
Postad: 13 mar 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?

suad 513
Postad: 13 mar 10:46

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

suad 513
Postad: 13 mar 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 14271
Postad: 13 mar 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.

suad 513
Postad: 13 mar 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 14271
Postad: 13 mar 11:46

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

suad 513
Postad: 13 mar 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 14271
Postad: 13 mar 16:18

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

suad 513
Postad: 13 mar 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
suad 513
Postad: 13 mar 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 14271
Postad: 13 mar 17:59

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

suad 513
Postad: 13 mar 18:10

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

Svara Avbryt
Close