Ruby:调用函数时得到TypeError。发生了什么?

时间:2009-12-04 22:40:59

标签: ruby

我是一个红宝石新手,并且在下面的代码工作中遇到问题

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

puts factorial(numbers)

我一直得到错误消息无法将“修复”转换为“factorial”中的数组(TypeError)。在这种情况下,任何人都能帮我解决我做错的事吗?提前致谢

4 个答案:

答案 0 :(得分:6)

正如mquander所说,numbers显然是一个数组。

所以你需要的是:

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

顺便说一下,你的错误与递归无关。

确认mquander的理论:

> 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

答案 1 :(得分:3)

我不知道任何Ruby,但我怀疑numbers是一个数字数组,而不仅仅是一个数字,当你将它传递给factorial时,它会尝试执行计算并炸毁。 (将数组与零进行比较,乘以或减去它是没有意义的。)

您需要更改factorial以接受多个数字并找到每个数字的阶乘,或者(更容易)更改调用代码,以便在数字集合上一次计算一个阶乘。

答案 2 :(得分:0)

你可能正在寻找类似的东西:

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

答案 3 :(得分:0)

作为kch代码的补充,您可以修改函数来处理数组和标量输入。

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的简化类型检查代码