2010-12-04 53 views
2

我需要一個用Ruby編寫的方法來計算變化。我已經用Java編寫了它,但是因爲我是Ruby的新手,所以我錯過了Ruby實現。紅寶石與重複越野車方法的差異

的方法suposed做到這一點:
方法(1, 「01」)=> [ 「0」, 「1」]
方法(2, 「01」)=> [ 「00」, 「01」,「10」,「11」] ...所以你明白了。

注:在Ruby IMPL,我給paralms這樣的:方法(2,[ 「0」,1" ]),但是這不是一個問題

我的Java IMPL:

public static List<String> Variations(int strength, String usableChars) { 
    List<String> list = 
     new ArrayList<String>((int) Math.pow(usableChars.length(), strength)); 

    if (strength == 0) { 
     list.add(""); 
    } else { 
     List<String> l = Variations(strength - 1, usableChars); 
     for (char c : usableChars.toCharArray()) { 
      for (String s : l) { 
       list.add(c + s); 
      } 
     } 
    } 
    return list; 
} 

而且它工作正常,但這個是我的Ruby實現:

def Variation (strength, arrayOfString) 
    array = Array.new(arrayOfString.size**strength) 

    if strength == 0 
     array << "" 
    else 
     a = Variation(strength-1, arrayOfString) 
     for i in arrayOfString do 
      for j in a do 
       array << (i + j) 
      end 
     end 
    end 
    return array 
end 

在這方面,我不斷收到錯誤消息test.rb:10:'變異':不能轉換成零字符串(類型錯誤)。

回答

2

在Ruby中,數組根據需要自動增長。因此,改變你的數組初始化來自:

array = Array.new(arrayOfString.size**strength) 

array = [] 

要列舉了在字符串中的每個字符,而不是

for i in arrayOfString do 

做到這一點:

arrayOfString.each_char do |i| 

最終結果:

#!/usr/bin/ruby1.8 

def Variation (strength, arrayOfString) 
    array = [] 
    if strength == 0 
    array << "" 
    else 
    a = Variation(strength - 1, arrayOfString) 
    arrayOfString.each_char do |i| 
     for j in a do 
     array << (i + j) 
     end 
    end 
    end 
    return array 
end 

p Variation(2, '01') # => ["00", "01", "10", "11"] 

each_char在Ruby> = 1.8.7中,或者你可以從backports gem得到它。

+0

謝謝,工作正常。我有意地聲明瞭數組的大小,以免在每次添加新元素時增加大小(在Java中,我不需要聲明大小)。有什麼辦法可以在Ruby中做到這一點? – 2010-12-04 14:51:27