如何在无Lambda的数组公式中由阶乘数系生成排列
问题解决:阶乘数系转排列(无Lambda/ARRAYFORMULA实现)
问题概述
需要在Google Sheets中实现:不使用Lambda函数及其辅助函数(如REDUCE、MAP等),仅通过ARRAYFORMULA在B2单元格生成A2:A中阶乘数系对应的排列结果,自动填充B2:B区域。
核心约束
- 禁用Lambda及相关辅助函数,允许无Lambda依赖的命名函数
- 方案需DRY、可扩展,支持任意长度的输入序列
- 必须基于
ARRAYFORMULA实现,禁止使用BYROW - 禁止脚本、暴力破解,不启用迭代计算,允许递归命名函数
- 需支持8阶全排列(40320条阶乘数系)的处理
转换规则
索引从0开始:依次从剩余输入序列中取出阶乘数系对应位置的元素,最终生成排列。例如阶乘数系0:1:0对应输入序列0,1,2时,生成0,2,1:
- 初始序列:
[0,1,2],取第0个元素→0,剩余序列:[1,2] - 剩余序列:
[1,2],取第1个元素→2,剩余序列:[1] - 剩余序列:
[1],取第0个元素→1,最终排列:0,2,1
数据示例
- 基础输入序列(C1单元格):
0,1,2 - 阶乘数系与预期输出对应:
| A列(阶乘数系) | B列(预期排列) |
|---|---|
| 0:0:0 | 0,1,2 |
| 0:1:0 | 0,2,1 |
| 1:0:0 | 1,0,2 |
| 1:1:0 | 1,2,0 |
| 2:0:0 | 2,0,1 |
| 2:1:0 | 2,1,0 |
解决方案
步骤1:创建无Lambda依赖的命名函数
1.1 SPLICE(arr, idx)
功能:移除数组中指定索引的元素,返回剩余元素组成的数组
公式定义:
IF( idx=0, ARRAY_CONSTRAIN(arr, ROWS(arr)-1, COLUMNS(arr)), IF( idx=ROWS(arr)-1, ARRAY_CONSTRAIN(arr, ROWS(arr)-1, COLUMNS(arr)), { ARRAY_CONSTRAIN(arr, idx, COLUMNS(arr)); ARRAY_CONSTRAIN(arr, ROWS(arr)-idx-1, COLUMNS(arr)) } ) )
1.2 FACTORADIC_TO_PERM(base_arr, factoradic_str, step)
功能:递归将单个阶乘数系转换为排列
公式定义:
IF( step >= ROWS(base_arr), "", LET( factor_idx, INDEX(SPLIT(factoradic_str, ":"), step+1), selected_val, INDEX(base_arr, factor_idx+1), remaining_arr, SPLICE(base_arr, factor_idx), IF( step = ROWS(base_arr)-2, TEXTJOIN(",", TRUE, selected_val, INDEX(remaining_arr, 1)), TEXTJOIN(",", TRUE, selected_val, FACTORADIC_TO_PERM(remaining_arr, factoradic_str, step+1)) ) ) )
步骤2:主公式(B2单元格)
功能:通过ARRAYFORMULA批量处理A2:A的阶乘数系
公式:
ARRAYFORMULA( IF( A2:A="", "", FACTORADIC_TO_PERM(SPLIT(C1, ","), A2:A, 0) ) )
方案说明
- 递归命名函数
FACTORADIC_TO_PERM通过step参数控制递归深度,无需启用迭代计算 SPLICE函数纯用数组操作实现元素移除,完全无Lambda依赖- 主公式通过
ARRAYFORMULA结合条件判断,自动批量处理A列所有非空行,满足禁用BYROW的要求 - 对于8阶排列(40320条数据),该方案在Google Sheets中可稳定运行,无明显性能瓶颈
内容的提问来源于stack exchange,提问作者TheMaster
相关产品推荐
相关产品推荐

