我正在尝试编写计算阶乘的程序。但是,当我尝试运行下面的代码时,出现此错误: undefined method `*' for nil:NilClass (NoMethodError)
1.upto(number) {|x| a = x==1 ? 1 : a*x }
我是否错误地设置了三元运算符,还是有其他问题?
谢谢您的帮助
我正在尝试编写计算阶乘的程序。但是,当我尝试运行下面的代码时,出现此错误: undefined method `*' for nil:NilClass (NoMethodError)
1.upto(number) {|x| a = x==1 ? 1 : a*x }
我是否错误地设置了三元运算符,还是有其他问题?
谢谢您的帮助
您的三元运算符设置正确,但您的变量a
未在您进行乘法运算时定义。
这会起作用,因为b
它有一个值:
b = 5
1.upto(number) {|x| a = x==1 ? 1 : b*x }
我会这样做:
def factorial(number)
(2 .. number).inject(1) { |m, n| m * n }
end
factorial(1) # => 1
factorial(2) # => 2
factorial(3) # => 6
factorial(5) # => 120
inject
对于这样的事情是一种有用的方法,并且不限于与数字一起使用。
它可以写得更简洁:
(1..n).inject(:*) || 1
它来自“ Ruby 阶乘函数”。这会给你一些东西来咀嚼一段时间。
您的代码正在做一些不正确的事情:
a
在运行之前从未定义过,因此a*x
注定要失败,因为您不能将 anil
乘以x
.upto
会将当前值作为 传递给块x
,但分配给a
将失败,因为它始终是一个新的局部变量a
。a
除非您在块的范围之外定义它,否则没有静态内存。upto
不能那样工作。你会得到返回的种子值,所以你会得到 back 1
。解决这类问题最好使用 Ruby 附带的 IRB。在交互式会话中,您可以尝试对您的代码进行变体,看看哪些是有效的。这比尝试编写脚本并完成编辑/运行周期要快得多/容易得多和方便得多。
那这个呢:
factorial = Hash.new{ |x,y| x[y]= y<2 ? 1 : x[y-1]*y }
让我们通过进入 IRB 来测试它,看看它做了什么:
>> factorial = Hash.new{ |x,y| x[y]= y<2 ? 1 : x[y-1]*y }
{}
>> factorial[1]
1
>> factorial
{
1 => 1
}
>> factorial[2]
2
>> factorial
{
1 => 1,
2 => 2
}
>> factorial[100]
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
>> factorial
{
1 => 1,
2 => 2,
3 => 6,
4 => 24,
5 => 120,
6 => 720,
7 => 5040,
8 => 40320,
9 => 362880,
10 => 3628800,
...
100 => 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
}
哟!你要计算每个中间值!?它将迅速消耗内存,几乎没有优势。