-
2019-06-12 18:34:55
算法训练 6-1 递归求二项式系数值
时间限制:10.0s 内存限制:256.0MB
问题描述样例输入
一个满足题目要求的输入范例。
3 10
样例输出
与上面的样例输入对应的输出。数据规模和约定
输入数据中每一个数的范围。
例:结果在int表示时不会溢出。import java.util.Scanner; public class 递归求二项式系数 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int k = in.nextInt(); int n = in.nextInt(); System.out.print(suan(k,n)); } private static int suan(int k, int n) { if(k==0||k==n) { return 1; } else { return suan(k,n-1)+suan(k-1,n-1); } } }
更多相关内容 -
Java实现蓝桥杯二项式的系数规律
2019-07-20 18:36:35二项式的系数规律,我国数学家很早就发现了。 如【图1.png】,我国南宋数学家杨辉1261年所著的《详解九章算法》一书里就出现了。 其排列规律: 1 1 1 2 1 3 3 1 4 6 4 1 5 10 10 5 1 6 15 20 15 6 1 7 21 .....二项式的系数规律,我国数学家很早就发现了。
如【图1.png】,我国南宋数学家杨辉1261年所著的《详解九章算法》一书里就出现了。
其排列规律:
1 1 1 2 1 3 3 1 4 6 4 1 5 10 10 5 1 6 15 20 15 6 1 7 21 35 35 21 7 1
如下的程序,用来建立N行的杨辉三角形。请填写划线部分缺少的代码。
注意:只填写划线部分的代码,不要填写任何多余的内容。
public class A { public static void main(String[] args) { int N = 8; int[][] a = new int[N][N] ; for(int i=0; i<N; i++){ a[i][0] = 1; a[i][i] = 1; } for(int i=1; i<N; i++){ for(int j=1; j<i; j++) _____________________________; //填空 } for(int i=0; i<N; i++){ for(int j=0; j<=i; j++) System.out.print(String.format("%-5d", a[i][j])); System.out.println(); } } } 答案:a[i][j] = a[i - 1][j - 1] + a[i - 1][j]
-
05二项式系数Cnk.md
2020-05-17 09:11:12一个简单的动态规划,配合二项式系数和杨辉三角。 CNK=CN−1K−1+CN−1K C_N^K=C_{N-1}^{K-1}+C_{N-1}^K CNK=CN−1K−1+CN−1K #include<iostream> #include<vector> using namespace std; int ...一个简单的动态规划,配合二项式系数和杨辉三角。
C N K = C N − 1 K − 1 + C N − 1 K C_N^K=C_{N-1}^{K-1}+C_{N-1}^K CNK=CN−1K−1+CN−1K#include<iostream> #include<vector> using namespace std; int Cnk(int n, int k) { vector<vector<int>>c; vector<int>c2; c2.push_back(1); c.push_back(c2); c2.push_back(1); c.push_back(c2); for(int i=2;i<n+1;i++) { vector<int>c1; c1.push_back(1); for(int j=1;j<i;++j) { int x=c[i-1][j-1]+c[i-1][j]; c1.push_back(x); } c1.push_back(1); c.push_back(c1); } return c[n][k]; } int main(void) { int n,k; cin>>n>>k; cout<<Cnk(n,k)<<endl;; return -1; }
-
二项式定理(Java实现及代码重审)
2011-04-22 17:33:00在上一篇文章中,我总结了从阅读《编程珠玑I》中获得的一些启示。... 作为代码重审和回顾的一个例子,我对以前的一个粗糙的二项式定理实现进行了重审和改写。当时,主要是为了学习动态规划法技术,运在上一篇文章中,我总结了从阅读《编程珠玑I》中获得的一些启示。其中有非常重要的一条:代码重审和回顾。通过对以前写过的代码进行重新审视和改进(以现在的经验),使之更具实用性,从而学习新的东西。你敢于面对以前写过的代码吗?如果你都不敢面对,谁还能有这个勇气?
作为代码重审和回顾的一个例子,我对以前的一个粗糙的二项式定理实现进行了重审和改写。当时,主要是为了学习动态规划法技术,运用它来计算二项式系数。
简单回顾二项式定理的相关知识:
(a+b)^n= a^n + C(n,1)a^(n-1)b+...+C(n,k)a^(n-k)b^k +...+ C(n,n-1)ab^(n-1) +b^n
其中: C(n,0)= C(n,n) = 1; C(n,k) = C(n, n-k); C(n,k)= C(n-1, k-1) + C(n-1,k)
计算方法: 例如C(4,2)
S1:构造数组: a[0:4][0:4]= 0
S2:a[0][0] = 1;
S3:a[1][0] = 1; a[1][1] = 1;
S4:a[2][0] = 1; a[2][1] = 2; a[2][2] = 1
S5:a[3][0] = 1; a[3][1] = 3; a[3][2] = 3; a[3][3] = 1
S6:a[4][0] = 1; a[4][1] = 4; a[4][2] = 6
如上所示,自上向下运用公式计算即可得到a[4][2] = 6.动态规划法通过保存并重用已经计算的值,从而避免不必要的计算时间,提高运行时间效率;其代价是一定的空间效率。这里,空间效率是O(n^2);后面可以看到,通过重用空间,空间效率可以降低到O(n)(否则,很快就内存不足了)。
如何改写呢?首先要定义好类的接口和功能。对于该二项式类BinomialTheorem(命名要贴切,英文不知道如何拼写?搜索!):
1.提供唯一参数为 二项式的幂 ,通过公共构造器传入;
2.显示该二项式展开式的字符串表示。
这里,仅仅只留出两个公共接口。简单的接口可使类更易使用;此外,在改写的过程中,发现要提供一个计算组合系数C(n,k)的便利方法。
改进的几个方面:
[1] 将其改为值对象。值对象是状态不可变的对象;对于同样的值应当返回同一个实例。值对象需要覆写equals 和hashCode方法;而如何使得对于同一个值参数返回同一个实例呢?参考Integer.ValueOf()实现,定义了一个内部嵌套类BinoTheoremCache,存放256个缓存BinomialTheorem对象。若取BinomialTheorem(i), 0<=i < 256 , 那么,直接从缓存中取;否则,使用 new来获取。这也说明一点:如果不太清楚某某怎么实现的,可以参考JDK源码来获取思路和启示。
[2]大整数: 计算到 C(60,30) 就发现整型不够用了。n= 60 就无法获得正确结果,这个类是毫无用处的。必须使用大整数;这里直接使用了java提供的 BigInteger. 具体实现是如何呢?留待以后推敲。这里仅仅给出猜想:应该是用整型数组拼接而成。int i可以表示 2147483647; 那么 int[]arr = new int[2] ; arr 可以表示到21474836472147483647这么大的数(转换为字符串形式)。每个整数用一个整型数组表示显然浪费空间;那么可以分段表示:若 i<= 2147483647 , 则用含一个整数的数组表示; 若 2147483647< I <= 21474836472147483647;则用含两个整数的数组表示。依次类推。接下来就需要实现数组的加法、减法、乘法等。
[3]空间效率: 如果采用初始的a[0:n][0:n]那么,其空间效率是O(n^2);当 n= 10000 时;int[0:10000][0:10000]需要 10000*10000*4/1024/1024= 381.47MB 空间;对于n= 100000 就无能为力了;因此,如果总是囿于小数据处理,那么,会有一种“取之不尽,用之不竭”的错觉;一旦深入到大数据集的处理领域,就不得不经常面对JavaOutOfMemoryError 了。
如何改进其空间效率呢?思路是直观的:重用空间。可以发现:A. 考虑到对称性,C(n,k)= C(n, n-k) , 实际上只需要a[0:n][0:n/2]; B. 当矩阵a[j-1][i]用来计算 a[j][i] i = 0,1,..., n/2 ; 1 <=j <= n之后, a[j-1][i]便不再起作用;因此,可以重用a[j-1][i], i= 0,1,..., n/2 的空间; 于是,只需要a[0:1][0:n/2]就可以了; 进一步地, 可以只需要a[0:n/2]空间 ,不过必须要倒着计算:
假设a[0: 2] 存储着C(4,0) , C(4,1), C(4,2) ; 即:
a[0]= C(4,0), a[1] = C(4,1) , a[2] = C(4,2) ; 则
S1:a[2] = C(5,2) = 2C(4,2) = 2 *a[2];
S2:a[1] = C(5,1) = C(4,0) + C(4,1) = a[0] + a[1];
S3:a[0] = C(5,0) = 1;
如果顺着计算,会产生覆盖:
S1:a[0] = C(5,0) =1;
S2:a[1] = C(5,1) =C(4,0) +C(4,1)
S3: a[2] = C(5,2) = 2C(4,1) //! a[1]已被覆盖为C(5,1)
这里实际上说明了一个比较普遍的现象:虽然动态规划法通常牺牲一定的空间来换取时间效率;但空间效率通常是有一定的提升和优化的空间的。
[4] 一个简单的运行时间测量框架
测量方法运行时间是一个较为频繁的操作,尤其是当实现一定的算法,并期望知道其性能的时候。通过写一个比较简单的运行时间测量框架,可以方便以后的算法性能测量应用。目前还只能接受单个问题规模参数的测试。这与程序测试等其实都是一本万利的事情。最初,可能觉得很麻烦,一段时间熟悉后,当你掌握相关方法和技术后,开发速度就自然提上去了。熟能生巧。
[5]小结:
不得不说,在这个代码重审和改进的过程中,确实学到了不少东西,也体验到了不断精益求精的一些感受,很好很充实。一个类,要写好可不容易!当然,改写后的最终程序并不一定就有多完善,不过,实用性是有很大提升的。程序中有不足之处,还恳请读者指正。
Java 代码实现:
BinomialTheorem.java
一个简单的运行时间测试框架 RuntimeMeasurement.java
BinomialTheorem 测试类 : BinomialTest.java
-
计算机等级考试--二级Java的知识点大全
2019-03-16 20:42:59算法不等于程序,也不等于计算方法。 2、算法的基本特征: 1)确定性,算法中每一步骤都必须有明确定义,不允许有多义性; 2)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止; 3)可行性,... -
动态规划 计算二项式系数
2013-10-09 00:28:16动态规划计算二项式系数,主要用到了一个性质C(m,n)=C(m,n-1)+C(m-1,n-1); 这个式子将C(m , n)的计算问题表述为了(问题描述)C(m-1 , n -1)和C(m -1,n)两个较小的交叠子问题。 初始条件:C(m , m) ... -
蓝桥试题 算法训练 6-1 递归求二项式系数值 JAVA
2020-03-16 16:13:33样例输入 ...思路:仔细观察式子,递归的的写法它已经告诉你了!! import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(Sy... -
计算机二级Java考试笔记
2019-03-11 10:45:49有序线性表的长度为n,则有序线性表中二分查找,最坏情况下的比较数为log2^n 2、教务管理系统为应用软件 3、软件测试的目的是为了发现错误而执行程序的过程,并不涉及改正错误 程序调试的任务是诊断和改正... -
动态规划——1 计算二项式系数
2014-01-21 12:41:33/** * 计算二项式系数 * 动态规划 * O(nk) * * @author chenxuegui * */ public class BinomialCoefficient { -
2022计算机Java二级考试四十五套题真题【收藏版】(一周裸考计划)
2020-11-27 10:42:35当你看到这篇文章的时候,相信自己已经在考试的路上,或者即将踏入计算机二级考试的道路。先收藏为敬。再网上看了很多的java面试题,有很多都是零零碎碎的,有或者是需要付费加密????的,加个vip什么的,故而以下是... -
动态规划 - 计算二项式系统 ---MATLAB代码
2016-04-30 21:51:34例如:计算 C( n , k ) , 代码如下: function y = Binomial( n , k ) %UNTITLED Summary of this function goes here % Detailed explanation goes here c = [ ] ; for i = 1 : n -
递归求二项式系数值
2016-11-30 22:09:34算法训练 6-1 递归求二项式系数值 样例输入 一个满足题目要求的输入范例。 3 10 样例输出 与上面的样例输入对应的输出。 数据规模和约定 输入数据中每一个数的范围。 例:结果在int表示时不会溢出。... -
ACMjava杨辉三角形与二项式定理递推实现与组合实现
2014-04-18 21:12:01package ... import java.util.Scanner; public class 杨辉三角形与二项式定理递推 { static Scanner cin = new Scanner(System.in); static int C[][] = new int[1 ][1 ]; public static void -
算法趣谈--二项式展开
2018-09-11 16:06:57import java.io.IOException; import java.util.Scanner; public class Yanghuisanjiao { static int a; static int b; static int power; static class Term{ int power_a; int po... -
蓝桥杯-递归求二项式系数值(java)
2017-04-02 17:13:33算法训练 6-1 递归求二项式系数值 时间限制:10.0s 内存限制:256.0MB 问题描述 样例输入 一个满足题目要求的输入范例。 3 10 样例输出 与上面的样例输入对应的输出。 数据规模和约定 -
Java全国计算机等级考试二级笔记---公共知识部分
2018-09-16 17:20:50Java全国计算机二级笔记 ———公共知识部分 作者 :arsoooo 本内容供要参加java全国二级计算机等级考试的参考 这是我初学java时做题总结的,会有自己乱总结出来的不普遍的结论或者错误的地方,... -
二项分布的递归和非递归实现(Java实现)
2017-08-23 16:41:48二项分布: 定义:n个独立的是/非试验中成功次数k的离散概率分布,每次实验成功的概率为p,记作B(n,p,k)。 概率公式:P(ξ=K)= C(n,k) * p^k * (1-p)^(n-k) 其中C(n, k) = (n-k) !/(k! * (n-k)!),记作ξ~B(n,p),... -
【数据结构与算法】二项队列的Java实现
2020-02-23 14:47:34Java分析并实现一个完整的二项队列 -
算法训练 6-1 递归求二项式系数值
2017-01-30 22:40:25问题描述 样例输入 一个满足题目要求的输入范例。 3 10 样例输出 与上面的样例输入对应的输出。...package 递归求二项式系数值;import java.util.Scanner;public class Main { public static int Combinatio -
Java计算组合数以及生成组合排列
2018-11-24 00:28:29组合数计算 公式法 逐个相除法(错误) 逐个相除法修正版 素数幂乘法 基本公式法 平方差连乘法 组合恒等法 简单递归法 杨辉三角法 杨辉三角优化法 二进制法 组合数计算小结 获取数组的组合排列 二进制法... -
Java求8+88+888+8888········的前二十项和
2019-06-08 13:32:26首先,我们分析这道题,从一个8一直加到二十个8,肯定要考虑到最后获取值的取值范围而long类型的最大值为9223372036854775807,很明显求二十个8的范围超出了long类型的范围。 检测代码如下所示: public static void... -
计算机java开发实习周记20篇
2021-02-27 08:25:59从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 传统J2EE应用的开发效率低,Spring作为开源的中间件,独立于各种应用服务器,甚至无须应用服务器的支持,也能提供应用服务器的功能,如... -
Java 基础高频面试题(2021年最新版)
2021-03-31 23:39:26最新 Java 基础高频面试题 -
牛逼!Java 从入门到精通,超全汇总版
2021-05-06 19:40:33文章目录Java 基础Head First JavaJava 核心技术卷一Java 编程思想设计模式Head First 设计模式图解设计模式设计模式重学 Java 设计模式Java 进阶Java 并发编程实战Java 并发编程艺术Java 并发编程之美图解Java多...