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 的语言表达能力确实很强。

相关推荐
呼啦啦啦啦啦啦啦啦7 小时前
常见的排序算法
java·算法·排序算法
anlogic7 小时前
Java基础 8.18
java·开发语言
练习时长一年8 小时前
AopAutoConfiguration源码阅读
java·spring boot·intellij-idea
源码宝9 小时前
【智慧工地源码】智慧工地云平台系统,涵盖安全、质量、环境、人员和设备五大管理模块,实现实时监控、智能预警和数据分析。
java·大数据·spring cloud·数据分析·源码·智慧工地·云平台
David爱编程10 小时前
面试必问!线程生命周期与状态转换详解
java·后端
LKAI.11 小时前
传统方式部署(RuoYi-Cloud)微服务
java·linux·前端·后端·微服务·node.js·ruoyi
HeyZoeHey11 小时前
Mybatis执行sql流程(一)
java·sql·mybatis
2301_7930868711 小时前
SpringCloud 07 微服务网关
java·spring cloud·微服务
柳贯一(逆流河版)12 小时前
Spring 三级缓存:破解循环依赖的底层密码
java·spring·缓存·bean的循环依赖
该用户已不存在14 小时前
OpenJDK、Temurin、GraalVM...到底该装哪个?
java·后端