我有一个将十进制数转换为二进制数的函数,但我需要使函数递归。我不知道如何使这个函数调用自己。任何帮助将非常感激。
这是我的功能:
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
提前谢谢!
答案 0 :(得分:0)
这很简单。我会使用名为tail recursion的东西来实现它。记住将十进制数(假设无符号)转换为二进制数的算法。
直到数字为0 ......
一个。取数字并除以2
湾如果有余数,则从左侧附加一个1,所以output <- [1 output]
。否则,附上一个0,所以output <- [0 output]
。
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已达到其递归限制。