Вопрос

Мне нужен метод, написанный в Ruby, который вычисляет вариации. Я уже написал это в Java, но, как я новичок, чтобы Ruby, есть просто то, что я скучаю о реализации Ruby.

Метод должен сделать это:
Метод (1, «01») => [«0», «1»
Метод (2, "01") => ["00", "01", "10", "11"] ... Итак, вы получаете идею.

ПРИМЕЧАНИЕ. В RUBY INMUM я даю паральмам, как это: метод (2, [«0», 1 "]), но это не проблема.

Моя Java Impro:

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: в «варианте»: не может преобразовать NIL в String (TypeError).

Это было полезно?

Решение

В 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"]

Cover_char находится в Ruby> = 1.8.7, или вы можете получить его из Backports Gem..

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top