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. C#利用开源软件ffMpeg截取视频图片

    #region 从视频画面中截取一帧画面为图片 /// <summary> /// 从视频画面中截取一帧画面为图片 /// </summary> /// <param n ...

  2. DTCMS会员中心快速更改样式思路

    非常简便 制作一个public.css文件,包含网站头部和底部的样式代码 每个会员中心模版导入这个文件就可以 把原先style.css的头部和底部样式代码删除

  3. 手机网站中 限制图片宽度 JS图片等比例缩放

    <script type="text/javascript"> $(function () { var w = $(".content-co").w ...

  4. iOS Mac系统下Ruby环境安装

    由EasyIOS引出的一系列问题:转载的上一篇CocoaPods安装和使用教程中说明了,为什么要使用cocoapods ,但是要安装cocoapods需要Ruby环境,安装Ruby环境首先需要安装Xc ...

  5. 《C和指针》 读书笔记 -- 第9章 字符串、字符和字节

    1.字符串以NUL结尾,但字符串长度不包括NUl字节. 2.复制字符串 char *strcpy(char *dst,char const *src); 3.连接字符串 char *strcat(ch ...

  6. 1028. List Sorting (25)

    #include <vector> #include <stdio.h> #include <string.h> #include <algorithm> ...

  7. NYOJ 994 海盗分金 逆向递推

    链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=994 题意: 有n个海盗劫得了窖藏的m块金子,并准备瓜分这些战利品.按照古老流传下来的分金法则 ...

  8. mysql优化之sakila测试数据库

    下载地址,选择相应的版本来进行安装测试 http://dev.mysql.com/doc/index-other.html 相关说明 http://dev.mysql.com/doc/sakila/e ...

  9. 机器学习基石的泛化理论及VC维部分整理(第六讲)

    第六讲 第五讲主要讲了机器学习可能性,两个问题,(1)\(E_{in} 要和 E_{out}\) 有很接近,(2)\(E_{in}\)要足够小. 对于第一个假设,根据Hoefding's Inequa ...

  10. shell复习---文件解压命令

    需要自己部署服务端,故在申请了空间之后,需要自己安装linux自己,自己安装Apache等,所以下载的压缩文件需要运行.网上找了一些解压命令不对,特别试了下面的方法有效,特别记录一下: 用ssh 登陆 ...