0

我正在尝试编写计算阶乘的程序。但是,当我尝试运行下面的代码时,出现此错误: undefined method `*' for nil:NilClass (NoMethodError)

1.upto(number) {|x| a = x==1 ? 1 : a*x }

我是否错误地设置了三元运算符,还是有其他问题?

谢谢您的帮助

4

2 回答 2

3

您的三元运算符设置正确,但您的变量a未在您进行乘法运算时定义。

这会起作用,因为b它有一个值:

b = 5

1.upto(number) {|x| a = x==1 ? 1 : b*x }
于 2013-09-12T18:00:19.233 回答
2

我会这样做:

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将失败,因为它始终是一个新的局部变量aa除非您在块的范围之外定义它,否则没有静态内存。
  • 在很多 Ruby 迭代器中,块的值可以用作返回值。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
}

哟!你要计算每个中间值!?它将迅速消耗内存,几乎没有优势。

于 2013-09-12T18:16:17.270 回答