编写factorial()函数,不区分0和其他数字

时间:2015-07-26 23:53:13

标签: math language-agnostic factorial

这个问题已经困扰了我很长一段时间:是否有可能编写一个阶乘函数(在任何编程语言中),而没有任何if statement(或类似的)在调用{1时返回0 {1}}也作为参数?

许多阶乘函数都是这样的(Python):

def factorial(n):
    for x in range(1, n):
        n *= x
    return n if n > 0 else 1

但我不知道是否可以在不区分n的不同值的情况下完成......你怎么看?这不是速度和优化的问题,只是我的好奇心。

4 个答案:

答案 0 :(得分:2)

0!定义为1。

以下是我的代码的结果。

0 factorial = 1
1 factorial = 1
2 factorial = 2
3 factorial = 6
10 factorial = 3628800

这里的Java代码没有if语句,

package com.ggl.testing;

public class Factorial {

    public static void main(String[] args) {
        int n = 0;
        System.out.println(n + " factorial = " + factorial(n));
        n = 1;
        System.out.println(n + " factorial = " + factorial(n));
        n = 2;
        System.out.println(n + " factorial = " + factorial(n));
        n = 3;
        System.out.println(n + " factorial = " + factorial(n));
        n = 10;
        System.out.println(n + " factorial = " + factorial(n));
    }

    public static long factorial(int n) {
        long product = 1L;

        for (int i = 2; i <= n; i++) {
            product *= (long) i;
        }

        return product;
    }

}

答案 1 :(得分:2)

这是一个Haskell版本:

factorial n = product [1 .. n]

不确定这是否被视为作弊。

答案 2 :(得分:0)

有许多方法可以用代码计算数字的阶乘 最初的问题显示了如何通过递归来实现,一个答案显示了如何使用for循环。同样可以通过while循环实现 另一个答案显示了Haskell中数组的乘积函数(类似于Matlab中的prod(1:n))。

在Javascript中使用循环计算n的阶乘(包括n = 0)的另一种方法是:

function factorial(n){
    return (new Array(n)).join().split(",").map((x,i) => i+1).reduce((x,y) => x*y)
}

答案 3 :(得分:0)

    def factor(n):
      fact=1
      for i in range (1,n+1):
        fact= fact*1
      return fact

    try:
      x=int(input('Input a number to find the factiorial: '))
      print(factor(x))

    except:
      print('Number should be an integer')
      x=int(input('Input a number to find the factiorial:  '))
      print(factor(x))

希望对您有所帮助!