阶乘

ES6 入门系列 (三) 尾递归

送分小仙女□ 提交于 2019-12-20 02:16:36
  递归我们不陌生,   那什么是尾递归呢?   为什么要用尾递归呢?   尾递归怎么用呢?   带着这三个问题我们来了解它, 我们知道递归非常耗费内存,一不小心就会发生‘栈溢出’, 相信你一定遇到过这个错误: stack overflow, 尾递归就是用来优化递归的这个问题的。   尾递归的定义: 在函数的最后一步返回自身,也就是显示地return自身就称为尾递归。对于尾递归来说, 由于只存在一个调用帧,所以永远不会发生‘栈溢出’。   我们来举例说明尾递归的好处: 比如计算n的阶乘, 我们首先想到找规律, n的阶乘等于n* (n-1)的阶乘 找出口1的阶乘等于1 然后我们就很自然的用递归写出 function jieCheng(n) { if (n===1) { return 1 } return n * jieCheng(n -1); } const result = jieCheng(5); console.log(result); // 120 很自然, so easy有木有,    but, 这样我们每递归一次,上一次的调用记录还保存着, 也就是说我们计算n的阶乘最多要保存n个调用记录,复杂度为O(n).    改成尾递归:     function weiJieCheng(n, total=1) { if (n === 1) { return total; }

【Java】递归递推的应用

喜夏-厌秋 提交于 2019-12-20 00:28:09
利用阶乘公式来计算组合式: 程序设计思想: 根据公式来计算组合数的大小,从键盘输入n,k的值,设计一个计算阶乘的大小,如果输入的数a为1或0,则直接return 1,否则运用递归,计算a-1的阶乘,直到a为1时,递归结束。 程序流程图: 程序源代码: public static void main(String args[]) { int n ,k,c; Scanner in=new Scanner(System.in); System.out.print("输入从n个数中选k个数中n,k的值:"); n=in.nextInt(); k=in.nextInt(); System.out.println("结果为:"); c=jiecheng(n)/(jiecheng(k)*jiecheng(n-k)); System.out.println(c); } public static int jiecheng(int x) {   int y=1;   if(x==1||x==0)   y=1;   else y=jiecheng(x-1)*x;   return y; } 根据杨辉三角递推求组合数 程序设计思想: 根据杨辉三角的规律,得出杨辉三角的第n行的第m个的值等于该位置的元素的上一行的左右两个输的和,然后根据杨辉三角与组合数的关系即c(n,m)等于杨辉三角的第n+1的第m

6-8 简单阶乘计算 (10分)

人盡茶涼 提交于 2019-12-16 17:13:30
本题要求实现一个计算非负整数阶乘的简单函数。 函数接口定义: int Factorial ( const int N ) ; 其中N是用户传入的参数,其值不超过12。如果N是非负整数,则该函数必须返回N的阶乘,否则返回0。 裁判测试程序样例: # include <stdio.h> int Factorial ( const int N ) ; int main ( ) { int N , NF ; scanf ( "%d" , & N ) ; NF = Factorial ( N ) ; if ( NF ) printf ( "%d! = %d\n" , N , NF ) ; else printf ( "Invalid input\n" ) ; return 0 ; } /* 你的代码将被嵌在这里 */ 输入样例: 5 输出样例: 5! = 120 int Factorial ( const int N ) { int sum = 1 ; if ( N < 0 ) { return 0 ; } else { for ( int i = 1 ; i <= N ; ++ i ) { sum * = i ; } return sum ; } } 来源: CSDN 作者: 清风丶cc 链接: https://blog.csdn.net/weixin_44547670/article

1091:求阶乘的和

老子叫甜甜 提交于 2019-12-15 19:57:15
1091:求阶乘的和 【题目描述】 给定正整数n,求不大于n的正整数的阶乘的和(即求1!+2!+3!+…+n!),输出阶乘的和。 【输入】 输入有一行,包含一个正整数n(1 < n < 12)。 【输出】 输出有一行:阶乘的和。 【输入样例】 5 【输出样例】 153 代码 # include <bits/stdc++.h> using namespace std ; int main ( ) { int n , num = 1 , sum = 1 ; cin >> n ; for ( int i = 2 ; i <= n ; i ++ ) { num * = i ; sum + = num ; } cout << sum ; return 0 ; } 来源: CSDN 作者: hipoole 链接: https://blog.csdn.net/hipoole/article/details/103552055

计算值的阶乘

佐手、 提交于 2019-12-10 07:39:48
#计算 num 的阶乘 def factorial ( num ) : i , multiply = 1 , 1 while i < num + 1 : multiply *= i i += 1 yield multiply if __name__ == '__main__' : # 生成器 user_input = input ( '请输入你需要计算的阶乘' ) f = factorial ( int ( user_input ) ) while True : try : x = next ( f ) except StopIteration as e : print ( x ) break # 数学类 import math print ( math . factorial ( int ( user_input ) ) ) 来源: CSDN 作者: MonCasper 链接: https://blog.csdn.net/qq_43036676/article/details/103458141

一文教你学会递归解题

↘锁芯ラ 提交于 2019-12-06 23:48:32
前言 递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google 的 PageRank 算法都能看到,也是面试官很喜欢的考点 最近看了不少递归的文章,收获不小,不过我发现大部分网上的讲递归的文章都不太全面,主要的问题在于解题后大部分都没有给出相应的时间/空间复杂度,而时间/空间复杂度是算法的重要考量!递归算法的时间复杂度普遍比较难(需要用到归纳法等),换句话说,如果能解决递归的算法复杂度,其他算法题题的时间复杂度也基本不在话下。另外,递归算法的时间复杂度不少是不能接受的,如果发现算出的时间复杂度过大,则需要转换思路,看下是否有更好的解法 ,这才是根本目的,不要为了递归而递归! 本文试图从以下几个方面来讲解递归 什么是递归? 递归算法通用解决思路 实战演练(从初级到高阶) 力争让大家对递归的认知能上一个新台阶,特别会对递归的精华:时间复杂度作详细剖析,会给大家总结一套很通用的求解递归时间复杂度的套路,相信你看完肯定会有收获 什么是递归 简单地说,就是如果在函数中存在着调用函数本身的情况,这种现象就叫递归。 以阶乘函数为例,如下, 在 factorial 函数中存在着 factorial(n - 1) 的调用,所以此函数是递归函数 public int factorial(int n) { if (n < =1) { return 1;

川大新生杯——欧拉筛

佐手、 提交于 2019-12-05 20:33:56
mod的一些性质 (a mod n) (b mod n)=(ab) mod n ((a mod n)(b mod n)) mod n=(ab) mod n 如果a≡b(mod m),x≡y(mod m),则a+x≡b+y(mod m)。 如果a≡b(mod m),x≡y(mod m),则ax≡by(mod m)。 如果ac≡bc(mod m),且c和m互质,则a≡b(mod m) (就是说同余式两边可以同时除以一个和模数互质的数)。 川大新生杯——模板筛 lglg最近爱上了炒股,他想在股票市场内买一些股票。 现在有编号为1,2,3,...,100000000的100000000支股票,每个股票的价值等于其编号的阶乘(例如编号为5的股票的价值就是120)。 lglg是一个很挑剔的人,他只喜欢编号为质数的股票,但他很有钱,因此他希望买下所有编号小于等于N(1<=N<=1e8)并且编号为质数的股票,请你帮他算一算这些股票的价值之和。 由于价值和很大,他希望你能告诉他价值之和对P(1e3<=P<=1e5)取模后的值。 输入描述: 输入包含多组数据 第一行是一个正整数 T(1<=T<=1000),代表数据的组数。每组数据只有一行,包含两个正整数 N 和 P 数字之间用空格隔开,其代表的含义及范围已在题面中给出。 输出描述: 每组数据输出一行

输入整数求阶乘

ぐ巨炮叔叔 提交于 2019-12-05 07:34:50
import java.util.Scanner; public class Work4{ public static void main(String[] args){ // 创建Scanner对象 Scanner sc = new Scanner(System.in); System.out.print("请输入一个整数:"); // 声明赋值 输入的整数变量 int i = sc.nextInt(); // 阶乘 int n = 1; for(int i1 = i;i1 < 10 && i1 >= 1; i1--){ n *= i1; } System.out.println("这个数的阶乘:" + n); } } 来源: https://www.cnblogs.com/a276665092/p/11914103.html

CF1204E Natasha, Sasha and the Prefix Sums——DP/数学(组合数)

最后都变了- 提交于 2019-12-04 16:52:49
CF1204E Natasha, Sasha and the Prefix Sums——DP/数学(组合数) 题面1600174884    CF1204E 解析   题意就是要求所有由 n n个 1 1、 m m个 − 1 −1构成的序列的最大前缀和的和  算法一 ( D P ) (DP)    n n, m m都小于等于 2000 2000, 显然可以 D P DP   设 d p [ i ] [ j ] dp[i][j]表示由 i i个 1 1, j j个 − 1 −1构成的序列的最大前缀和的和    i i个 1 1, j j个 − 1 −1构成的序列, 可以看做是在 i − 1 i−1个 1 1, j j个 − 1 −1的序列的最前面加一个 1 1得到,也可以看做是在 i i个 1 1, j − 1 j−1个 − 1 −1的序列最前面加一个 − 1 −1得到   这也就意味着, d p [ i ] [ j ] dp[i][j]可以由 d p [ i − 1 ] [ j ] dp[i−1][j]与 d p [ i ] [ j − 1 ] dp[i][j−1]转移过来   先考虑 d p [ i − 1 ] [ j ] dp[i−1][j]对 d p [ i ] [ j ] dp[i][j]的贡献,对于任意一种 i − 1 i−1个 1 1, j j个 − 1 −1的序列,