2011-01-29 216 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';