2011-01-29 173 views
1

我正在尝试使用递归编写0和1s的所有6位排列(即,[0 0 0 0 1],[0 0 0 0 1 0],[0 0 0 0 1 1],[0 0 0 1 0 0],... [1 1 1 1 1 1 1])。我正在从Yahoo! Answers得到一个提示,我已经得到了以下内容,但它不会一路走到最后,并且有重复的条目。递归0s和1s递归

function [c] = myIEEEBaby_all_decimals(h, n) 

% n: number of characters more to add 

if n == 0 
    converter(h); 
    return 
end 

in1 = [h 1]; 
in2 = [h 0]; 

converter(in1); 
converter(in2); 

if length(h) < n 
    myIEEEBaby_all_decimals([in1], n-1) 
    myIEEEBaby_all_decimals([in2], n-1) 
end 

end 

function [d] = converter(IEEE) 
% convert custom IEEE representation to decimal 

IEEE = [zeros(1,6-length(IEEE)), IEEE]; 

s = IEEE(1); 

characteristic = IEEE([2,3]); 
k = find(fliplr(characteristic)) - 1; 
c = sum(2.^k); 

fraction = IEEE([4:6]); 
f = sum(2.^-(find(fliplr(fraction)))); 

d = (-1)^s*2^(c-1)*(1+f); 

disp([num2str(IEEE),' : ', num2str(d)]); 

end 

输出(MATLAB)只是:

>> myIEEEBaby_all_decimals([],6) 
0 0 0 0 0 1 : 0.75 
0 0 0 0 0 0 : 0.5 
0 0 0 0 1 1 : 0.875 
0 0 0 0 1 0 : 0.625 
0 0 0 1 1 1 : 0.9375 
0 0 0 1 1 0 : 0.6875 
0 0 1 1 1 1 : 1.875 
0 0 1 1 1 0 : 1.375 
0 0 1 1 0 1 : 1.625 
0 0 1 1 0 0 : 1.125 
0 0 0 1 0 1 : 0.8125 
0 0 0 1 0 0 : 0.5625 
0 0 1 0 1 1 : 1.75 
0 0 1 0 1 0 : 1.25 
0 0 1 0 0 1 : 1.5 
0 0 1 0 0 0 : 1 
0 0 0 0 0 1 : 0.75 
0 0 0 0 0 0 : 0.5 
0 0 0 0 1 1 : 0.875 
0 0 0 0 1 0 : 0.625 
0 0 0 1 1 1 : 0.9375 
0 0 0 1 1 0 : 0.6875 
0 0 0 1 0 1 : 0.8125 
0 0 0 1 0 0 : 0.5625 
0 0 0 0 0 1 : 0.75 
0 0 0 0 0 0 : 0.5 
0 0 0 0 1 1 : 0.875 
0 0 0 0 1 0 : 0.625 
0 0 0 0 0 1 : 0.75 
0 0 0 0 0 0 : 0.5 
+2

这不是“排列”的意思:http://en.wikipedia.org/wiki/Permutation – 2011-01-29 19:54:09

回答

1

只需迭代从0到2 -1和呼叫Matlab的dec2bin(...)功能。您可以使用sprintf(...)填充结果零。

+0

啊,谢谢!这比我想象的要容易得多。 – 2011-01-31 23:27:10

1

如果要计算6位数的每个可能的值,那么使用递归的方法要比使用递归更有效。使用函数DEC2BIN是一种选择,但this previous question显示使用函数BITGET或通过查找表编制索引的实现要快得多。例如,这里有一个可能的解决方案:

allperms = cell2mat(arrayfun(@(b) {bitget((0:2^6-1).',b)},6:-1:1)); 

那么你可以申请你的converter功能的结果,在行的基础上:

converter = @(b) (1-2.*b(:,1)).*...    %# The sign contribution 
      2.^(b(:,2:3)*[2; 1] - 1).*...  %# The exponent contribution 
      (1 + b(:,4:6)*[0.125; 0.25; 0.5]); %# The fraction contribution 
values = converter(allperms); 

而且你可以按照如下显示的结果:

>> disp(sprintf('%d %d %d %d %d %d : %f\n',[allperms values].')) 
0 0 0 0 0 0 : 0.500000 
0 0 0 0 0 1 : 0.750000 
0 0 0 0 1 0 : 0.625000 
0 0 0 0 1 1 : 0.875000 
0 0 0 1 0 0 : 0.562500 
0 0 0 1 0 1 : 0.812500 
0 0 0 1 1 0 : 0.687500 
0 0 0 1 1 1 : 0.937500 
0 0 1 0 0 0 : 1.000000 
0 0 1 0 0 1 : 1.500000 
0 0 1 0 1 0 : 1.250000 
0 0 1 0 1 1 : 1.750000 
0 0 1 1 0 0 : 1.125000 
0 0 1 1 0 1 : 1.625000 
0 0 1 1 1 0 : 1.375000 
0 0 1 1 1 1 : 1.875000 
0 1 0 0 0 0 : 2.000000 
0 1 0 0 0 1 : 3.000000 
0 1 0 0 1 0 : 2.500000 
0 1 0 0 1 1 : 3.500000 
0 1 0 1 0 0 : 2.250000 
0 1 0 1 0 1 : 3.250000 
0 1 0 1 1 0 : 2.750000 
0 1 0 1 1 1 : 3.750000 
0 1 1 0 0 0 : 4.000000 
0 1 1 0 0 1 : 6.000000 
0 1 1 0 1 0 : 5.000000 
0 1 1 0 1 1 : 7.000000 
0 1 1 1 0 0 : 4.500000 
0 1 1 1 0 1 : 6.500000 
0 1 1 1 1 0 : 5.500000 
0 1 1 1 1 1 : 7.500000 
1 0 0 0 0 0 : -0.500000 
1 0 0 0 0 1 : -0.750000 
1 0 0 0 1 0 : -0.625000 
1 0 0 0 1 1 : -0.875000 
1 0 0 1 0 0 : -0.562500 
1 0 0 1 0 1 : -0.812500 
1 0 0 1 1 0 : -0.687500 
1 0 0 1 1 1 : -0.937500 
1 0 1 0 0 0 : -1.000000 
1 0 1 0 0 1 : -1.500000 
1 0 1 0 1 0 : -1.250000 
1 0 1 0 1 1 : -1.750000 
1 0 1 1 0 0 : -1.125000 
1 0 1 1 0 1 : -1.625000 
1 0 1 1 1 0 : -1.375000 
1 0 1 1 1 1 : -1.875000 
1 1 0 0 0 0 : -2.000000 
1 1 0 0 0 1 : -3.000000 
1 1 0 0 1 0 : -2.500000 
1 1 0 0 1 1 : -3.500000 
1 1 0 1 0 0 : -2.250000 
1 1 0 1 0 1 : -3.250000 
1 1 0 1 1 0 : -2.750000 
1 1 0 1 1 1 : -3.750000 
1 1 1 0 0 0 : -4.000000 
1 1 1 0 0 1 : -6.000000 
1 1 1 0 1 0 : -5.000000 
1 1 1 0 1 1 : -7.000000 
1 1 1 1 0 0 : -4.500000 
1 1 1 1 0 1 : -6.500000 
1 1 1 1 1 0 : -5.500000 
1 1 1 1 1 1 : -7.500000 
+0

事实上,矢量化的`dec2bin`似乎比这里介绍的`bitget`解决方案更快。试试:`x = dec2bin(1:2^6-1); allperms = x-'0';` – 2013-09-19 13:40:07

0

如果您想以简单的方式编写所有排列,请使用dec2bin来获取推荐的@Bart等二进制值。

但是,如果使用矢量化,这种操作通常可以显着提高效率。

所以不是遍历所有的值,并获得结果1个,只要做到这一点:

x = dec2bin(1:2^6-1); 

如果你想输出是一个矩阵,也这样做:

x = x - '0';