java递归输出杨辉三角,杨辉三角算法 | zhangman523
杨辉三角 的算法实现
杨辉三角形是排列成三角形的一系列数字。 在杨辉三角形中,每一行的最左边和最右边的数字总是 1。 对于其余的每个数字都是前一行中直接位于它上面的两个数字之和。
下面给出一个5行的杨辉三角:
基本情况
可以看到,每行的最左边和最右边的数字是基本情况,在这个问题中,它总是等于 1。
因此,我们可以将基本情况定义如下:
f(i,j) = 1 where j=1 or j=i
递推关系
让我们从杨辉三角形内的递推关系开始。
首先,我们定义一个函数 f(i, j)它将会返回杨辉三角形第 i 行、第 j 列的数字。
我们可以用下面的公式来表示这一递推关系:
f(i,j)=f(i−1,j−1)+f(i−1,j)
java 实现
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
1
2
3
4
5
6
7
8
9
10
11
输入:5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
方法一 迭代实现
public List generateTrangle(int numRows){
List> list = new ArrayList<>();
for(int i=0;i
List subList = new ArrayList<>();
list.add(subList);
for(int j=0;j
f(j==i||j==0){//每行的最左边和最右边的数字都是1
subList.add(1);
}else{
//递推关系
subList.add((list.get(i-1).get(j-1)+list.get(i-1).get(j)));
}
}
}
return list;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
publicListgenerateTrangle(intnumRows){
List>list=newArrayList<>();
for(inti=0;i
ListsubList=newArrayList<>();
list.add(subList);
for(intj=0;j
f(j==i||j==0){//每行的最左边和最右边的数字都是1
subList.add(1);
}else{
//递推关系
subList.add((list.get(i-1).get(j-1)+list.get(i-1).get(j)));
}
}
}
returnlist;
}
方法二 递归实现
public List> generateTriangleByRecursive(int numRow) {
List> list = new ArrayList<>();
for (int i = 0; i < numRow; i++) {
List subList = new ArrayList<>();
for (int j = 0; j < i + 1; j++) {
subList.add(generate_Triangle_by_recursive(i, j));
}
list.add(subList);
}
return list;
}
private int generate_Triangle_by_recursive(int i, int j) {
int result;
if (j == 0 || j == i) {
result = 1;
} else {
result =
(generate_Triangle_by_recursive(i - 1, j - 1) + generate_Triangle_by_recursive(
i - 1, j));
}
return result;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
publicList>generateTriangleByRecursive(intnumRow){
List>list=newArrayList<>();
for(inti=0;i
ListsubList=newArrayList<>();
for(intj=0;j
subList.add(generate_Triangle_by_recursive(i,j));
}
list.add(subList);
}
returnlist;
}
privateintgenerate_Triangle_by_recursive(inti,intj){
intresult;
if(j==0||j==i){
result=1;
}else{
result=
(generate_Triangle_by_recursive(i-1,j-1)+generate_Triangle_by_recursive(
i-1,j));
}
returnresult;
}
在上面的例子中,您可能已经注意到递归解决方案可能会导致一些重复的计算,例如,我们重复计算相同的中间数以获得最后一行中的数字。 举例说明,为了得到 f(5, 3) 的结果,我们在 f(4, 2) 和 f(4, 3) 的调用中计算了 f(3, 2) 两次。下面我们优化递归算法
方法三 递归+记忆化
public List> generateTriangleByRecursive(int numRow) {
List> list = new ArrayList<>();
Map> cacheMap = new HashMap<>();
for (int i = 0; i < numRow; i++) {
List subList = new ArrayList<>();
for (int j = 0; j < i + 1; j++) {
subList.add(generate_Triangle_by_recursive(i, j, cacheMap));
}
list.add(subList);
}
return list;
}
private int generate_Triangle_by_recursive(int i, int j,
Map> cacheMap) {
if (cacheMap.containsKey(i) && cacheMap.get(i).containsKey(j)) {
return cacheMap.get(i).get(j);
}
int result;
if (j == 0 || j == i) {
result = 1;
} else {
result =
(generate_Triangle_by_recursive(i - 1, j - 1, cacheMap) + generate_Triangle_by_recursive(
i - 1, j, cacheMap));
}
if (!cacheMap.containsKey(i)) {
Map map = new HashMap<>();
cacheMap.put(i, map);
}
cacheMap.get(i).put(j, result);
return result;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
publicList>generateTriangleByRecursive(intnumRow){
List>list=newArrayList<>();
Map>cacheMap=newHashMap<>();
for(inti=0;i
ListsubList=newArrayList<>();
for(intj=0;j
subList.add(generate_Triangle_by_recursive(i,j,cacheMap));
}
list.add(subList);
}
returnlist;
}
privateintgenerate_Triangle_by_recursive(inti,intj,
Map>cacheMap){
if(cacheMap.containsKey(i)&&cacheMap.get(i).containsKey(j)){
returncacheMap.get(i).get(j);
}
intresult;
if(j==0||j==i){
result=1;
}else{
result=
(generate_Triangle_by_recursive(i-1,j-1,cacheMap)+generate_Triangle_by_recursive(
i-1,j,cacheMap));
}
if(!cacheMap.containsKey(i)){
Mapmap=newHashMap<>();
cacheMap.put(i,map);
}
cacheMap.get(i).put(j,result);
returnresult;
}
拓展算法
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
示例:
输入: 3
输出: [1,3,3,1]
1
2
3
4
输入:3
输出:[1,3,3,1]
public List getRow(int rowIndex) {
List> list = new ArrayList<>();
for(int i=0;i
List subList = new ArrayList<>();
list.add(subList);
for(int j=0;j
if(j==i||j==0){//first and end
subList.add(1);
}else{
subList.add((list.get(i-1).get(j-1)+list.get(i-1).get(j)));
}
}
}
return list.get(rowIndex);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
publicListgetRow(introwIndex){
List>list=newArrayList<>();
for(inti=0;i
ListsubList=newArrayList<>();
list.add(subList);
for(intj=0;j
if(j==i||j==0){//first and end
subList.add(1);
}else{
subList.add((list.get(i-1).get(j-1)+list.get(i-1).get(j)));
}
}
}
returnlist.get(rowIndex);
}
java递归输出杨辉三角,杨辉三角算法 | zhangman523相关推荐
- python杨辉三角输出指定行_python杨辉三角输出指定行_使用python打印十行杨辉三角过程详解...
如何用python输出杨辉三角 程序输出需要实现如下效果: [1] [1,1] [1,2,1] [1,3,3,1] .. 方法:迭代,生成器 12345678910111213141516171819 ...
- java实现a3打印_javase 打印杨辉三角
下面用java写一个打印10行杨辉三角的程序,其中用到的是二维数组 package com.test001; //本实例打印10行杨辉三角 /* * 1 * 1 1 * 1 2 1 * 1 3 3 1 ...
- C语言 生成并输出一个杨辉三角的前7行,分别按左下三角,右下三角以及金字塔形式输出。
生成并输出一个杨辉三角的前7行,分别按左下三角,右下三角以及金字塔形式输出. #include <stdio.h> int main(){//左边的杨辉三角int a[7][7],i,j; ...
- HTML 杨辉三角,杨辉三角的实现
代码: import java.math.BigInteger; public class Main { static int N=12;//输出多少行 static int max= C(N/2,N ...
- 杨辉三角(下三角或者等腰三角)
//杨辉三角(下三角或者等腰三角) #include <stdio.h> int fun(int i,int j) { if(i==j||1==j) return 1; else retu ...
- 【Java基础】递归输出目录下所有文件路径
递归输出目录下所有文件路径 import java.io.File;public class FileTest {public static void main(String[] args) {// ...
- java 二叉树的高度_Java实现二叉树的建立、计算高度与递归输出操作示例
本文实例讲述了java实现二叉树的建立.计算高度与递归输出操作.分享给大家供大家参考,具体如下: 1. 建立 递归输出 计算高度 前中后三种非递归输出 public class Tree_Link { ...
- java json数据输出,java服务器端输出JSON格式数据
java服务器端输出JSON格式数据 本文我们讨论如何在服务器端输出 JSON 格式的数据.以 Java 为例,我们将演示将一个 Java 对象编码为 JSON 格式的文本. 将 String 对象编 ...
- java 递归 堆栈_Java中的堆栈安全递归
java 递归 堆栈 在本文中,摘自< Java中的函数编程 >一书,我解释了如何使用递归,同时避免了StackOverflow异常的风险. Corecursion正在使用第一步的输出作为 ...
最新文章
- 高危Windows 0day漏洞:看一眼就中毒
- 关于php语言的使用!
- mdi 子窗体 菜单 不合并。
- Linux下matlab断点调试
- net 控制台 定时_.NET Core实现基于Quart.Net的任务管理
- nmap结果导出html,nmap的简单使用 - osc_ijgldkz9的个人空间 - OSCHINA - 中文开源技术交流社区...
- linux之vim操作快速跳到下一个空格和上一个空格命令
- NOI图论算法:网络流
- 多个ajax执行混乱问题
- Kubernetes PV与PVC
- 一个指针占几个字节?原理是什么呢?
- 【计算机视觉】关于计算机视觉(随谈)
- 2021肇庆各中学高考成绩查询入口,2021高考即将来袭!肇庆各学校的同学们准备好了吗?...
- 虚拟服务器共享文件夹端口,如何查看共享文件夹端口
- 微信删除的聊天记录怎么恢复?2招快速解决
- 解决spring定时任务执行两次和tomcat部署缓慢的问题
- pi在c语言中代表什么6,《光纤通信技术》综合练习
- 输入法pad版android,百度输入法pad版 for android 3.0
- 在Ubuntu上安装CERTI
- 我的第一个开源库-DialogLoading弹出加载框(Kotlin版)