Perl实现FIFO顺序数组扣减计算的代码问题排查
问题排查与解决方案
原代码问题分析
- 嵌套循环逻辑错误:内层对
@subtr的遍历每次进入外层@base循环都会完整执行一遍,导致每个@subtr元素被重复扣减多次,完全不符合FIFO单次扣减的要求 - 未传递超额扣减额度:当前
@base元素不足以覆盖当前待扣减额度时,没有计算超额部分传递给下一个@base元素,而是直接进入下一轮循环 - 未记录指针位置:没有单独的指针分别记录当前待扣减的
@subtr元素位置、当前正在使用的@base元素位置,无法实现扣减流程的接续
修正后可运行代码
use strict; use warnings; my @base = (10,15,6,2); my @subtr = (2,4,6,2,2,5,7,2); # 双指针分别标记当前base元素索引、当前subtr元素索引 my $base_idx = 0; my $subtr_idx = 0; my $current_base = $base[$base_idx]; # 遍历所有subtr元素直到全部扣减完成 while ($subtr_idx < scalar @subtr) { my $to_sub = $subtr[$subtr_idx]; if ($current_base > $to_sub) { # 当前base足够扣减,直接减,移到下一个subtr $current_base -= $to_sub; $subtr_idx++; } elsif ($current_base == $to_sub) { # 刚好扣完当前base,移到下一个base,移到下一个subtr $base_idx++; $current_base = $base[$base_idx] if $base_idx < scalar @base; $subtr_idx++; } else { # 当前base不够扣,计算差额,移到下一个base,继续扣当前subtr的差额 my $remain_sub = $to_sub - $current_base; $base_idx++; die "base数组所有元素已扣完,仍有未完成扣减的subtr元素" if $base_idx >= scalar @base; $current_base = $base[$base_idx]; $current_base -= $remain_sub; $subtr_idx++; } } # 计算总剩余 my $total_remain = $current_base; for (my $i = $base_idx + 1; $i < scalar @base; $i++) { $total_remain += $base[$i]; } # 输出结果,位置从1开始计数符合常规使用习惯 my $final_pos = $base_idx + 1; my $final_remain = $current_base; print "扣减结束所处的base元素位置:$final_pos\n"; print "当前元素剩余值:$final_remain\n"; print "base数组总剩余值:$total_remain\n";
运行结果验证
运行代码后输出如下,完全匹配预期要求:
扣减结束所处的base元素位置:3 当前元素剩余值:1 base数组总剩余值:3
内容的提问来源于stack exchange,提问作者Paul Yang
相关产品推荐
相关产品推荐

