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

Writing a factorial() function without distinction between 0 and other numbers

这个问题困扰了我很长一段时间:是否可以编写一个阶乘函数(用任何编程语言)而不需要 if statement(或类似的)returns1 当也以 0 作为参数调用时?

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

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

但我不知道是否可以不区分n的不同值...您认为如何?这不是速度和优化的问题,只是我的好奇心。

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;
    }

}

这是一个 Haskell 版本:

factorial n = product [1 .. n]

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

有很多方法可以用代码计算一个数的阶乘。
原始问题显示了如何通过递归来完成,一个答案显示了如何使用 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)
}
    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))

希望对您有所帮助!