【发布时间】:2010-10-14 03:11:45
【问题描述】:
假设您正在使用具有可变长度数组的语言(例如,A[i] 用于 1..A.length 中的所有 i)并且必须编写一个采用 n (n : 1..8) 可变长度数组的例程长度为n 的可变长度数组中的项目,并且需要调用具有每个可能长度的过程n 项目数组,其中第一个是从第一个数组中选择的,第二个是从第二个数组中选择的,依此类推向前。
如果您想将具体的东西可视化,想象一下您的例程必须获取如下数据:
[ [ 'top hat', 'bowler', 'derby' ], [ 'bow tie', 'cravat', 'ascot', 'bolo'] ... ['jackboots','galoshes','sneakers','slippers']]
并进行以下过程调用(以任意顺序):
try_on ['top hat', 'bow tie', ... 'jackboots']
try_on ['top hat', 'bow tie', ... 'galoshes']
:
try_on ['derby','bolo',...'slippers']
这有时被称为中文菜单问题,对于固定的n 可以很简单地编码(例如n = 3,在伪代码中)
procedure register_combination( items : array [1..3] of vararray of An_item)
for each i1 from items[1]
for each i2 from items[2]
for each i3 from items[3]
register( [ii,i2,i3] )
但是如果n 可以变化,给出如下签名:
procedure register_combination( items : vararray of vararray of An_item)
编写的代码包含一个丑陋的 case 语句,我用一个更简单的解决方案替换了它。但我不确定这是重构它的最佳(当然也不是唯一)方法。
你会怎么做?聪明和令人惊讶是好的,但清晰和可维护更好——我只是通过这段代码,不想被回调。简洁、清晰和聪明是最理想的。
编辑:在其他人有机会回复之后,我将在今天晚些时候发布我的解决方案。
Teaser:我试图推销递归解决方案,但他们不接受,所以我不得不坚持在 HLL 中编写 fortran。
我选择的答案,贴在下面。
【问题讨论】:
标签: language-agnostic refactoring coding-style nested-loops