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. chrome jsonView插件安装

    chrome 应用商店打不开,想装插件愁死人了. 今天想到一个好方法,以 jsonView插件为例分享一下. 1.打开 https://github.com : 2.搜索 jsonView 链接:ht ...

  2. LeetCode之Single Number以及拓展

    Problem 1:一个数组中有一个数字a只出现一次,其他数字都出现了两次.请找出这个只出现一次的数字? 考察知识点:异或运算 思路:比如数字 b^b = 0     a^0 = a 因此,可以将数组 ...

  3. 【原创】一起学C++ 之指针、数组、指针算术 ---------C++ primer plus(第6版)

    C++ Primer Plus 第6版 指针和数组基本等价的原因在于指针算术! 一.指针 ⑴整数变量+1后,其值将增加1: ⑵指针变量+1后,增加的量等于它指向的类型的字节数: ⑶C++将数组名解析为 ...

  4. 通过MyEclipse生成Hibernate类文件和hbm.xml文件,或者annotation文件

    1.   前言 很多人都在使用myEclipse,很多公司也都使用hibernate框架,老版本的hibernate中,由于没有annotation,我们需要写两个文件来维护表与对象的关系,写一个类, ...

  5. java指令集

    0x00 nop      什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1   将int型-1推送至栈顶 0x03 iconst_0   将int型0 ...

  6. 360随身wifi怎样购买?360随身wifi怎样预约?

    ---恢复内容开始--- 360随身wifi怎样购买 想要购买360随身Wifi,可以登录360随身Wifi的官网wifi.360.cn,或者直接登陆京东商城进行购买,售价为19.9元,分黑.白两色. ...

  7. JPA2 关于 PagingAndSortingRepository

    And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd): Or --- 等价于 SQL 中的 ...

  8. 3.7 spring-property 子元素的使用与解析

    1.0 Property子元素的使用 property 子元素是再常用不过的了, 在看Spring源码之前,我们先看看它的使用方法, 1. 实例类如下: public class Animal { p ...

  9. Eclipse编辑jsp、js文件时,经常出现卡死现象解决汇总

    使用Eclipse编辑jsp.js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲.将所有用过的方法罗列如下: 1.取消验证 windo ...

  10. bzoj 1242: Zju1015 Fishing Net 弦图判定

    1242: Zju1015 Fishing Net弦图判定 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 214  Solved: 81[Submit ...