Java Iterator 实现杨辉三角

一、问题描述

杨辉三角定义如下:

复制代码
          1
         / \
        1   1
       / \ / \
      1   2   1
     / \ / \ / \
    1   3   3   1
   / \ / \ / \ / \
  1   4   6   4   1
 / \ / \ / \ / \ / \
1   5   10  10  5   1

把每一行看做一个list,试写一个 Iterator,不断输出下一行的 list:

java 复制代码
# 期待输出:
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

二、思路分析

我们先从第二行开始,看一下更通用的序列生成过程:

1、首尾两个元素固定是1

2、下一行的序列生成依赖于上一行

3、下一行实际需要生成的元素个数,是上一行序列长度-1

就比如

1,1\] -\> \[1,2,1\] L = \[1,1\] 2 = L\[0\]+L\[1\] result = \[1\]+\[2\]+\[1\]=\[1,2,1\] 需要生成 2 一个元素 ```java List in = Arrays.asList(1,1); List out = new ArrayList<>(); out.add(1); for (int i = 0; i < ( in.size()-1); i++) { out.add(in.get(i)+in.get(i+1)); } out.add(1); System.out.println(out); ``` ![](https://i-blog.csdnimg.cn/direct/6d0307a0e6f14345a5c8f2e53336d45f.png) \[1,2,1\] -\> \[1,3,3,1\] L = \[1,2,1\] 3 = L\[0\]+L\[1\] 3 = L\[1\]+L\[2\] result = \[1\]+\[3,3\]+\[1\] 需要生成 3,3 两个元素 ```java List in = Arrays.asList(1,2,1); List out = new ArrayList<>(); out.add(1); for (int i = 0; i < ( in.size()-1); i++) { out.add(in.get(i)+in.get(i+1)); } out.add(1); System.out.println(out); ``` ![](https://i-blog.csdnimg.cn/direct/494add823b2e46da928be7a7d9ae2d48.png) 从 \[1\] -\> \[1,1\] 是否也符合这个表达式呢? ```java List in = Arrays.asList(1); List out = new ArrayList<>(); out.add(1); for (int i = 0; i < ( in.size()-1); i++) { out.add(in.get(i)+in.get(i+1)); } out.add(1); System.out.println(out); ``` ![](https://i-blog.csdnimg.cn/direct/e0e89c0f80ae4a5082a0080df5b504a1.png) 至此,除了杨辉三角的第一行序列 \[1\],我们得到了一个通用的表达式,第一行序列 \[1\],就让它直接返回就好。 ```java if (idx==0) { return in; } List out = new ArrayList<>(); out.add(1); for (int i = 0; i < ( in.size()-1); i++) { out.add(in.get(i)+in.get(i+1)); } out.add(1); return out; ``` ## 三、代码实现 ```java package com.study.algorithm; import java.util.*; public class TriangleIter implements Iterator> { // 杨辉三角要展示几层 private Integer n; private Integer idx = 0; private List list = new ArrayList<>(); public TriangleIter(Integer n) { this.n = n; // 初始化第一个列表 [1] list.add(1); } @Override public boolean hasNext() { return idx < n; } @Override public List next() { list = generate(list); idx++; return list; } private List generate(List in) { if (idx==0) { return in; } List out = new ArrayList<>(); out.add(1); for (int i = 0; i < ( in.size()-1); i++) { out.add(in.get(i)+in.get(i+1)); } out.add(1); return out; } public static void main(String[] args) { TriangleIter iter = new TriangleIter(10); while(iter.hasNext()){ System.out.println(iter.next()); } } } ``` ![](https://i-blog.csdnimg.cn/direct/70476056a8fb48478b80a5306d82c57c.png) ## 四、语言比较 我用 Python 写过杨辉三角的列表生成式: ```python L = [1] + [ L[i]+L[i+1] for i in range( len(L)-1 ) ] + [1] ``` 并尝试用 Java 的流式计算来实现: ```java List out = IntStream.concat( IntStream.of(1), IntStream.concat(IntStream.range(0, in.size() - 1).map(i -> in.get(i) + in.get(i + 1)), IntStream.of(1)) ).boxed().collect(Collectors.toList()); ``` 发现并没有比 for 循环简洁多少。 Python 的语言表达能力确实很强。

相关推荐
郑州光合科技余经理36 分钟前
PHP构建:支撑欧美澳市场的同城生活服务平台开发
java·开发语言·数据库·uni-app·php·排序算法·生活
超级大只老咪8 小时前
数组相邻元素比较的循环条件(Java竞赛考点)
java
小浣熊熊熊熊熊熊熊丶8 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
毕设源码-钟学长8 小时前
【开题答辩全过程】以 公交管理系统为例,包含答辩的问题和答案
java·eclipse
啃火龙果的兔子8 小时前
JDK 安装配置
java·开发语言
星哥说事8 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
派大鑫wink8 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
xUxIAOrUIII9 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home9 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
醇氧9 小时前
org.jetbrains.annotations的@Nullable 学习
java·开发语言·学习·intellij-idea