具有动态边界的动态嵌套循环

时间:2016-01-18 14:56:39

标签: java loops nested-loops

我有一个LinkedList<点>点,随机值:

InvoicesController

我想要执行这种循环:

<div class="invoices-form">

    <?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'created')->textInput() ?>

    <?= $form->field($model, 'type')->textInput(['maxlength' => true]) ?>
  <hr />
  <?php if (is_array($invoiceItems)): ?>
  <?php foreach ($invoiceItems as $i => $item): ?>
  <?= $form->field($item, "[$i]id")->textInput();?>
    <?= $form->field($item, "[$i]item_id")->textInput();?>
    <?= $form->field($item, "[$i]unit_id")->textInput();?>
    <?= $form->field($item, "[$i]qty")->textInput();?>
  <?php  endforeach; ?>
  <?php  else: ?>
    <?= $form->field($invoiceItems, "item_id")->textInput();?>
    <?= $form->field($invoiceItems, "unit_id")->textInput();?>
    <?= $form->field($invoiceItems, "qty")->textInput();?>
  <?php endif; ?>    

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>

如果我不知道列表的大小,我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

可能有更好的方法来解决像这样的方程式,减少CPU和内存消耗,但像你的蛮力方法可以通过递归或一些辅助结构来实现,以跟踪状态。

通过递归你可以这样做:

 void permutate( List<Point> points, int pointIndex, int[] values ) {
   Point p = points.get(pointIndex);
   for( int x = p.x; x < p.y; x++ ) {
     values[pointIndex] = x;

     //this assumes pointIndex to be between 0 and points.size() - 1
     if( pointIndex < points.size() - 1 ) {          
       permutate( points, pointIndex + 1; values );
     }
     else { //pointIndex is assumed to be equal to points.size() - 1 here
       //you have collected all intermediate values so solve the equation
       //this is simplified since you'd probably want to collect all values where the result is correct
       //as well as pass the equation somehow
       int result = solveEquation( values );
     }
   }
 }

 //initial call
 List<Point> points = ...;
 int[] values = new int[points.size()];
 permutate( points, 0, values );

这将首先使用递归调用迭代点列表并将点索引提前一直到达到列表的末尾。每个递归调用将迭代点值并将当前值添加到相应位置的数组。然后使用该数组计算方程结果。

请注意,这可能会导致巨大方程式的堆栈溢出(“巨大”的含义取决于环境,但通常为几千个点)。如果在任何非平凡的情况下检查所有排列,性能可能真的低。