ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 184|回复: 6

[求助] 如何用递归的方式列出所有的组合

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-13 16:52 | 显示全部楼层 |阅读模式
如图所示,有若干列的元素,我想列出所有的组合方式。


  1. =LET(m,HSTACK(Age[Age],Plan[Plan]),REDUCE(Sex[Sex],SEQUENCE(COLUMNS(m)),LAMBDA(x,y,DROP(REDUCE(0,SEQUENCE(ROWS(x)),LAMBDA(a,b,LET(t,INDEX(x,b,),VSTACK(a,IFNA(HSTACK(t,TOCOL(CHOOSECOLS(m,y),3)),t))))),1))))
复制代码
  1. =LET(fx,LAMBDA(fx,x,LET(n,COLUMNS(x),IF(n=1,TOCOL(x,3),DROP(REDUCE(0,SEQUENCE(ROWS(TOCOL(CHOOSECOLS(x,n),3))),LAMBDA(a,b,LET(t,INDEX(TOCOL(CHOOSECOLS(x,n),3),b,),VSTACK(a,IFNA(HSTACK(fx(fx,DROP(x,,-1)),t),t))))),1)))),fx(fx,HSTACK(Sex[Sex],Age[Age],Plan[Plan])))
复制代码
我分别用双循环和递归的方式得到了正确的结果,但是想求助一下,我的递归的方式是否有什么优化的地方,我总觉得我自己的写法特别的傻,但是又不知道怎么修改。
微信图片_20240913165010.png

TA的精华主题

TA的得分主题

发表于 2024-9-13 18:17 | 显示全部楼层
感觉没必要硬刚递归的这一个法子
image.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-13 18:41 | 显示全部楼层
  1. =LET(f,LAMBDA(f,data,n,TOCOL(TOCOL(INDEX(data,,n),1)&"-"&TOROW(IF(n=COLUMNS(data)-1,INDEX(data,,n+1),f(f,data,n+1))))),f(f,B84:G89,1))
复制代码

很久之前写的一种方法,供参考:
图片.jpg

TA的精华主题

TA的得分主题

发表于 2024-9-13 18:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
另外,你如果有双循环的公式,就可以改成递归,递归省掉一层循环,满足条件返回结果即可。

TA的精华主题

TA的得分主题

发表于 2024-9-13 18:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
刚刚再写一个递归,供参考:

  1. =LET(f,LAMBDA(f,arr,res,IF(ISERR(@arr),res,f(f,DROP(arr,,1),DROP(REDUCE(0,TOCOL(TAKE(arr,,1),1),LAMBDA(x,y,VSTACK(x,IFNA(HSTACK(res,y),y)))),1)))),DROP(f(f,+B84:G89,0),,1))
复制代码

图片.jpg

TA的精华主题

TA的得分主题

发表于 2024-9-13 19:08 | 显示全部楼层
H2=OFFSET(B$1,INT((ROW(A1)-1)/COUNTA(D$2:D$8)/COUNTA(F$2:F$8))+1,)&""

I2=IF(H2="","",OFFSET(D$1,MOD(INT((ROW(B1)-1)/COUNTA(F$2:F$8)),COUNTA(D$2:D$8))+1,))

J2=IF(H2="","",OFFSET(F$1,MOD(ROW(A1)-1,COUNTA(F$2:F$8))+1,))
13169.png

TA的精华主题

TA的得分主题

发表于 2024-9-13 19:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Python+Pandas:
import pandas as pd

mi = pd.MultiIndex.from_product([['M', 'F'], [i for i in range(18)], ['Budget', 'Premium', 'Luxury']], names=['Sex', 'Age', 'Plan'])
df = pd.DataFrame(index=mi).reset_index()
df
image.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-15 13:04 , Processed in 0.032511 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表