J语言中如何基于已知地址修改嵌套Box内的数据?
直接用地址路径修改嵌套Box,无需递归
当然可以!你完全不用写递归函数,直接复用和提取时类似的地址路径逻辑就能完成修改,核心是利用嵌套结构的索引赋值特性——咱们直接来拆解怎么做:
核心思路
你提取数据时用的>0{>1{>1{a本质是逐层定位到目标元素的路径,修改时只需要定位到目标元素的父容器,然后对容器内的对应索引位置直接赋值即可,完全不用递归遍历整个结构。
具体实现
假设你的根Box是a,目标地址(1 1 0)对应的层级逻辑是:从根a出发,先取第1个元素,再取该结果的第1个元素,最后修改这个容器的第0个位置。那直接修改的代码可以写成:
// 定位到目标元素的父容器 parentBox ← >1{>1{a // 把父容器的索引0位置替换成<123(即boxed的123) parentBox[0] ⊂← ⊂123
如果要封装成可复用的verb(函数),可以写成:
modifyTarget ← { // ⍵是传入的根Box parent ← >1{>1{⍵ parent[0] ⊂← ⊂123 ⍵ // 返回修改后的根Box }
更通用的版本(支持任意地址)
如果以后要修改不同地址的元素,也不用递归,用循环逐层定位父容器即可(循环不属于递归,完全符合你的需求):
modifyAtAddress ← { address ← ⍺ // 传入的目标地址,比如(1 1 0) root ← ⍵ // 传入的根Box parent ← root // 遍历地址的前n-1个索引,定位到目标元素的父容器 :For idx :In address[1..≢address-1] parent ← parent[idx] :EndFor // 修改父容器的最后一个索引位置 parent[address[≢address]] ⊂← ⊂123 root } // 使用方式:(1 1 0) modifyAtAddress myRootBox
为什么不用递归?
递归是用来遍历未知深度的结构,但你已经明确知道了目标元素的精确地址路径,相当于有了“直达路线”,直接沿着路线走到父容器,然后修改对应位置就好,完全没必要绕递归的弯子——这和你提取数据时的逻辑是完全对称的,只是把“读”操作换成了“写”操作。
内容的提问来源于stack exchange,提问作者Ellie Y
相关产品推荐
相关产品推荐

