如何从Ruby中的阶乘方法中排除浮点数?

时间:2016-11-25 05:37:48

标签: ruby recursion

当找到阶乘,使用递归(Ruby)时,下面的代码找到整数的阶乘,但在浮点数的情况下失败。我怎么能调整这个? 我想过在数学中使用域名,但我不知道该怎么做。

def factorial num
  if num < 0
    return "Please provide a whole number."
  end

  if num <=1
    1
  else
    num * factorial(num-1)
  end

end

3 个答案:

答案 0 :(得分:4)

过滤掉浮动的最简单方法是使用使它们浮动的原因:) 它们不能完全被1整除。

def factorial num
  if (num % 1 != 0 || num < 0)
    return "Please provide a whole number."
  end

  if num <=1
    1
  else
    num * factorial(num-1)
  end
end

希望有所帮助。干杯

答案 1 :(得分:0)

虽然@CarySwoveland正确地指出,在数学中,“阶乘”操作仅针对自然数定义,但实数的推广存在于“伽马函数”的名称下。 gamma(n)等于n!对于自然数n。

[更新:正如@JörgWMittag解释的那样,它不是伽马(n),而是伽马(n + 1)等于n!]

伽玛函数在Ruby(see here)中可用,您可以为非自然数调用它。

但是,您需要注意,您的阶乘函数将具有某种不寻常的属性,它有时会返回Fixnum,有时还会返回Float。

答案 2 :(得分:0)

Ruby有一些在这里很有用的类型转换协议。特别是,任何想要充当Integer的对象都应该响应to_int。所以,您可以尝试将输入转换为Integer,Ruby将负责其余的工作:

def factorial(num)
  num = num.to_int
  # … carry on normally
end

这样,任何想要表现为Integer的内容都可以在此传递,而任何不符合raise NoMethodError的内容都会传递给rescue

如果你想真的很好,你可以NoMethodErrorraise TypeError NoMethodError带有描述性消息to_int。但通常情况下,任何Ruby程序员都理解类型转换协议,而Integer Integer表示您传递的内容不是<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <!-- change version as applicable --> <version>1.2</version> </dependency> - 就像期望<?php public function tourBanner($country){ $extraData = ['zero', 'one', 'two']; switch($country){ case 'country1': $bgImage = 'images/inside8.jpg'; break; case 'country2': $bgImage = 'images/inside7.jpg'; break; case 'country3': $bgImage = 'images/inside5.jpg'; break; case 'country4': $bgImage = 'images/inside6.jpg'; break; default: $bgImage = 'images/inside10.jpg'; break; } return view("your.blade.view", array( "bgImage" => $bgImage, 'extraData' => $extraData, )); } 的方法一样类似对象。