我是一个红宝石新手,并且在下面的代码工作中遇到问题
def factorial(n)
if n == 0
1
else
n * factorial(n-1)
end
end
puts factorial(numbers)
我一直得到错误消息无法将“修复”转换为“factorial”中的数组(TypeError)。在这种情况下,任何人都能帮我解决我做错的事吗?提前致谢
答案 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的简化类型检查代码