2010-12-04 3 views
2

변형을 계산하는 Ruby로 작성된 메서드가 필요합니다. 이미 Java로 작성했지만, Ruby를 처음 접했을 때 Ruby 구현에 대해 놓친 부분이 있습니다.Ruby 반복 버그 메서드가있는 변형

이 방법은 이렇게 suposed된다
방법 (1, "01") => [ "0", "1"]
방법 (2, "01") => [ "00" "01", "10", "11"] ... 아이디어를 얻을 수 있습니다.

참고 : ([ "0", 1 "] 2) 방법,하지만 그건 문제가되지이다

내 자바 IMPL : 루비 IMPL에, 나는이 같은 paralms을 제공합니다.

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; 
} 

그리고 그것은 잘 작동하고 그러나 내 루비 구현이다. 10 : : 나는 오류 메시지 test.rb가 계속이에서

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 

'변화'에가 : 문자열 (형식 오류)로 무기 호를 변환 할 수 없습니다.

답변

2

루비에서는 필요에 따라 배열이 자동으로 커집니다.

arrayOfString.each_char do |i| 

이렇게

for i in arrayOfString do 

대신, 문자열의 각 문자를 통해 열거 할 수

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

array = [] 

로 : 그래서에서 배열 초기화를 변경 최종 결과 :

#!/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"] 

각 _char는 Ruby> = 1.8.7이거나, backports gem에서 가져올 수 있습니다.

+0

감사합니다. 잘 작동합니다. 나는 intentionaly 배열의 크기를 선언했다. 그래서 새로운 원소를 추가 할 때마다 크기를 늘리지 않기를 바란다. (자바에서는 크기를 선언 할 필요가 없다). Ruby에서이 작업을 수행 할 수있는 방법이 있습니까? –

+0

루비는 배열 메모리를 청크로 재 할당하므로 확장 할 때마다 다시 할당 할 필요가 없습니다. 그러나'size' nils의 배열을 할당하려면'[nil] * size'가 그것을 할 것입니다. –

+0

@ user245543, 나는 소스 (array.c)로 돌아갔습니다; 내 기억이 맞아. Ruby는 16 개 요소를 저장할 수있는 충분한 공간을 가진 배열을 생성 한 다음 필요에 따라 청크로 확장합니다 (잘못 입력하지 않으면 배열의 요소가 많을수록 더 많은 메모리가 추가됩니다). 배열을 할당하는 데 사용되는 시간은 거의 문제가되지 않습니다. –