Factorial  计算阶乘

In mathematics, the factorial of a non-negative integer n, denoted by n!, is the product of all positive integers less than or equal to n. For example: 5! = 5 * 4 * 3 * 2 * 1 = 120. By convention the value of 0! is 1.

Write a function to calculate factorial for a given input. If input is below 0 or above 12 throw an exception of type ArgumentOutOfRangeException (C#) or IllegalArgumentException (Java).

More details about factorial can be found here: http://en.wikipedia.org/wiki/Factorial

刚开始没有注意题目的提示,可以直接判断大于12,就溢出了。想到了使用checked关键字来检查是否溢出。

https://msdn.microsoft.com/zh-cn/library/74b4xzyw.aspx   checked关键字的用法

public static class Kata
{
public static int Factorial(int n)
{
try
{
return Recursion(n);
}
catch
{
throw;
}
} public static int Recursion(int n)
{
if (n < )
{
throw new ArgumentOutOfRangeException();
}
try
{ int factorial = ;
if (n >= )
{
checked
{
factorial = n * Recursion(n - );
}
}
return factorial;
}
catch
{
throw new ArgumentOutOfRangeException();
}
}
}

其他人的解法:

递归计算

public static int Factorial(int n)
{
if(n < || n > )
throw new ArgumentOutOfRangeException();
return n > ? n * Factorial(n - ) : ;
}
using System;
using System.Linq; public static class Kata
{
public static int Factorial(int n)
{
if(n < || n > ) throw new ArgumentOutOfRangeException(); return Enumerable.Range(, n).Aggregate(, (x,y) => x * y);
}
}

需要注意的是

public static TAccumulate Aggregate<TSource, TAccumulate>(
this IEnumerable<TSource> source,
TAccumulate seed,
Func<TAccumulate, TSource, TAccumulate> func
)

Type Parameters

TSource

The type of the elements of source.  源数据中的数据的类型

TAccumulate

The type of the accumulator value.  累加器的值的类型

Parameters

source
Type: System.Collections.Generic.IEnumerable<TSource>

An IEnumerable<T> to aggregate over.     //源数据

seed
Type: TAccumulate

The initial accumulator value.    累加器的初始值

func
Type: System.Func<TAccumulate, TSource, TAccumulate>

An accumulator function to be invoked on each element.   每一个元素调用的累加器函数

Return Value

Type: TAccumulate
The final accumulator value.    返回值是累加器的最终值

https://msdn.microsoft.com/zh-cn/library/bb549218(v=vs.110).aspx

The Aggregate<TSource, TAccumulate>(IEnumerable<TSource>, TAccumulate, Func<TAccumulate, TSource, TAccumulate>) method
makes it simple to perform a calculation over a sequence of values.

此方法使得在一个序列上进行计算变得简单

This method works by calling func one time for each element in source.

此方法的通过让序列中的每个元素都会调用一次func委托来工作。

Each time func is called, Aggregate<TSource, TAccumulate>(IEnumerable<TSource>, TAccumulate, Func<TAccumulate, TSource, TAccumulate>) passes both the element from the sequence and an aggregated value (as the first argument to func).

每一次调用委托的时候,此方法传递序列中的当前元素以及累加值(累加值是作为fun中的第一个参数的)

The value of the seed parameter is used as the initial aggregate value.

seed参数作为累计值的初始值

The result of func replaces the previous aggregated value. Aggregate<TSource, TAccumulate>(IEnumerable<TSource>, TAccumulate, Func<TAccumulate, TSource, TAccumulate>) returns the final result of func.

func委托的返回值,会替代之前的累计值。  此方法返回func委托的最终结果

To simplify common aggregation operations, the standard query operators also include a general purpose count method, Count, and four numeric aggregation methods, namely Min, Max, Sum, and Average.

为了简化通用的聚合操作,标准查询操作符也包含了一个通过计数方法Count,此外,还有4个数值聚合方法,名为Min,Max,Sum和Average。

最后分析一下

Enumerable.Range(1, n).Aggregate(1, (x,y) => x * y)

Enumerable.Range(1, n)通过这个获取1到n的序列

Aggregate(1, (x,y) => x * y)其中1作为累加值的初始值  lambda表达式中的第一个参数表示的就是累加值,然后将x*y的值替换掉累加值,并作为下一次调用的x传入

遍历1到n

1     x=1,y=1   x=1*1;

2     x=1,y=2  x= 1*2;

3     x=2,y=3  x= 2*3

特别需要注意的是,当n=0的时候;Enumerable.Range(1, 0)中一个元素也没有,直接返回了累加器的初始值1

Factorial的更多相关文章

  1. [LeetCode] Factorial Trailing Zeroes 求阶乘末尾零的个数

    Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in log ...

  2. CodeForces 515C. Drazil and Factorial

    C. Drazil and Factorial time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  3. [CareerCup] 17.3 Factorial Trailing Zeros 求阶乘末尾零的个数

    LeetCode上的原题,讲解请参见我之前的博客Factorial Trailing Zeroes. 解法一: int trailing_zeros(int n) { ; while (n) { re ...

  4. [codeforces 516]A. Drazil and Factorial

    [codeforces 516]A. Drazil and Factorial 试题描述 Drazil is playing a math game with Varda. Let's define  ...

  5. LeetCode Factorial Trailing Zeroes

    原题链接在这里:https://leetcode.com/problems/factorial-trailing-zeroes/ 求factorial后结尾有多少个0,就是求有多少个2和5的配对. 但 ...

  6. 【LeetCode】172. Factorial Trailing Zeroes

    Factorial Trailing Zeroes Given an integer n, return the number of trailing zeroes in n!. Note: Your ...

  7. SPOJ #11 Factorial

    Counting trailing 0s of n! It is not very hard to figure out how to count it - simply count how many ...

  8. 欧拉工程第74题:Digit factorial chains

    题目链接:https://projecteuler.net/problem=74 数字145有一个著名的性质:其所有位上数字的阶乘和等于它本身. 1! + 4! + 5! = 1 + 24 + 120 ...

  9. CF Drazil and Factorial (打表)

    Drazil and Factorial time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

随机推荐

  1. 构造函数继承关键apply call

    主要我是要解决一下几个问题: 1.        apply和call的区别在哪里 2.        apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和 ...

  2. Linux文件目录结构说明

  3. compared woth QPSK, what is the advantages of QAM(16QAM or 64QAM?)

    1.QPSK QPSK是英文Quadrature Phase Shift Keying的缩略语简称,意为正交相移键控,是一种数字调制方式.在数字信号的调制方式中QPSK四相移键控是目前最常用的一种卫星 ...

  4. android模拟器打开时比较慢,Run As就找不到模拟器

    1.运行中输入cmd,然后回车,调出command窗口 2.用cd,将目录切换到adb所在目录,然后输入adb kill-server ,adb start-server 3.adb devices就 ...

  5. 解决rhel相关系统下yum找不到安装包的解决方法

    最近重新安装了Linux,用的版本是CentOS 5.1.但老是出现很多包找不到的情况. [root@toughhou /]# yum install rlwrap Loaded plugins: f ...

  6. Hibernate从入门到精通(八)一对多单向关联映射

    上次的博文Hibernate从入门到精通(七)多对一单向关联映射我们主要讲解了一下多对一单向关联映射,这次我们继续讲解一下一对多单向映射. 一对多单向关联映射 在讲解一对多单向关联之前,按照我们的惯例 ...

  7. collectionView代码创建

    @interface ViewController ()<UICollectionViewDataSource,UICollectionViewDelegateFlowLayout> @p ...

  8. VC++创建、调用dll的方法步骤

    文章来源:http://www.cnblogs.com/houkai/archive/2013/06/05/3119513.html 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有 ...

  9. centos startx 进入桌面后使用中文输入法

    (从runlevel 3进入桌面:英文 ,结果用不了中文输入法 囧) 但在中文桌面下可以输入中文 步骤: 由startx可以进入桌面 查看:which startx => /usr/bin/st ...

  10. WDS无线桥接

    因为放假回家,长时间不在家,家里也没什么人,所以也就没有网可以用.为了两个月办宽带又不值得,太过浪费了.于是就只能蹭网用了.当然,要和邻居打个招呼或者你能搞定密码的情况下不打招呼(嘿嘿...).但是有 ...