递归函数matlab十进制到二进制转换

时间:2015-03-30 17:39:18

标签: matlab recursion

我有一个将十进制数转换为二进制数的函数,但我需要使函数递归。我不知道如何使这个函数调用自己。任何帮助将非常感激。

这是我的功能:

function bin = myBinary (dec_nr)
i = 1; 
q = floor(dec_nr/2); %this is the quotient, the "floor" function is used to   round down 
r = rem(dec_nr, 2); % the "rem" function is used to get the remainder which will become the first binary value 
bin(i) = num2str(r(i)); % the remainder is converted and stored as a string 

while 2 <= q
dec_nr = q;
i = i + 1;
q = floor(dec_nr/2);
r = rem(dec_nr, 2);
bin(i) = num2str(r);
end
bin(i + 1) = num2str(q);
bin = fliplr(bin);
save myBinary

提前谢谢!

1 个答案:

答案 0 :(得分:0)

这很简单。我会使用名为tail recursion的东西来实现它。记住将十进制数(假设无符号)转换为二进制数的算法。

  1. 声明您要转换的号码。
  2. 最初声明输出为空。
  3. 直到数字为0 ......

    一个。取数字并除以2

    湾如果有余数,则从左侧附加一个1,所以output <- [1 output]。否则,附上一个0,所以output <- [0 output]

  4. output将包含您的号码的二进制表示。

    对于递归,您必须考虑以下两种情况:基础情况,其中算法停止并为您提供已知输出,以及递归< / strong>表示您需要继续操作的情况,并使用修改后的输入再次调用该函数。

    因此,通过提供一个辅助函数,可以很容易地通过尾递归实现你想要的东西,该函数接收给定状态下的输入数字(基本上是除以2之后的数字)多次)和一个二进制字符串,它为您提供二进制字符串构造的当前状态,因为您正在经历并确定每个位。

    您将反复调用此函数并获取输入数字并将其除以2,直到得到结果为0.您将首先调用具有原始输入编号的函数和空字符串。确保当您将输入数字发送回递归案例的函数时,您需要截断所产生的任何小数值,因此您将使用floor

    因此,一个可能的功能非常简单:

    function bin = bin2dec_recursive(in)
    
        %// Recursive helper
        function [out] = recursive_helper(in_number, binstr)
            %// Base case
            if in_number == 0
                out = binstr; %// Just return the current binary string
            %// Recursive case
            else
                %// Recurse - Integer divide input number and concatenate string
                out = recursive_helper(floor(in_number/2), [num2str(mod(in_number,2)) binstr]);
            end
        end
    
        %// call recursive helper
        bin = recursive_helper(in, '');
    end
    

    这句话的关键在于:

    out = recursive_helper(floor(in_number/2), [num2str(mod(in_number,2)) binstr]);
    

    当我们点击递归的情况时,我们需要通过将输入数除以2来再次调用该函数,输入二进制字符串是当前字符串,但我们在字符串的左边添加0或1。我们将数字转换为字符串num2str

    如果您希望拥有double个单位数字,只需删除递归案例中的num2str来电,并在{39}时将''替换为[] ;在上一行代码中第一次调用递归辅助函数。


    有了这个,这里有一些工作的例子:

    >> bin2dec_recursive(3)
    
    ans =
    
    11
    
    >> bin2dec_recursive(5)
    
    ans =
    
    101
    
    >> bin2dec_recursive(9)
    
    ans =
    
    1001
    
    >> bin2dec_recursive(127)
    
    ans =
    
    1111111
    
    >> bin2dec_recursive(200)
    
    ans =
    
    11001000
    

    次要注意事项

    请注意recursion limit for MATLAB is 500 calls。因此,使用递归,您只能计算最多500位的二进制数,因此这意味着您可以放入上述函数的最大十进制数约为2 500 - 1。任何更多的东西会给你一个错误,说MATLAB已达到其递归限制。