Ruby: получил TypeError при вызове функции. Что происходит? - PullRequest
0 голосов
/ 05 декабря 2009

Я новичок в рубине, и у меня проблема с приведением кода ниже для работы

def factorial(n)
  if n == 0
    1
  else
    n * factorial(n-1)
  end
end

puts factorial(numbers)

Я получаю сообщение об ошибке, не могу преобразовать Fixnum в Array (TypeError) в `factorial '. Кто-нибудь сможет мне помочь с ответом на то, что я делаю не так в этом случае? Заранее спасибо

Ответы [ 4 ]

6 голосов
/ 05 декабря 2009

Как говорит mquander, numbers, по-видимому, массив.

Так что вам нужно что-то вроде:

puts(numbers.map { |n| factorial(n) })

И, кстати, ваша ошибка не имеет ничего общего с рекурсией.

Подтверждение теории Маквандера:

> numbers = [1,2,3]
> puts factorial(numbers)
TypeError: can't convert Fixnum into Array

И просто из любопытства, вот как вы реализуете факториал в ruby ​​без рекурсии, чтобы вы не получили переполнение стека для больших чисел.

def factorial(n)
  (1..n).inject(1) { |ac, x| ac * x }
end
3 голосов
/ 05 декабря 2009

Я не знаю никакого Ruby, но я подозреваю, что numbers - это массив чисел, а не только одно, и когда вы передаете его в factorial, он пытается выполнить вычисление и взрывается. (Нет смысла сравнивать массив с нулем, умножать или вычитать его.)

Вам нужно либо изменить factorial, чтобы принять несколько чисел и найти факториал каждого, либо (проще) изменить код вызова для вычисления одного факториала за раз из набора чисел.

0 голосов
/ 05 декабря 2009

В дополнение к кч-коду, вы можете изменить функцию для обработки как массива, так и скалярного ввода.

def factorial(n)
  if n.is_a?(Array)
    return n.map {|n| factorial(n)}
  end
  raise unless n.is_a?(Integer) and (n >= 0)
  (n == 0) ? 1 : n * factorial(n-1)
end

Эта функция обрабатывает скаляры, массивы, вложенные массивы, недопустимые объекты и т. Д.

Редактировать: Включен упрощенный код проверки типов kch

0 голосов
/ 05 декабря 2009

вы, вероятно, ищете что-то вроде:

numbers.map { |n| factorial(n) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...