Pharo Smalltalk实现数组偶数平均值 用whileTrue:和do循环修复错误代码
Pharo Smalltalk 偶数平均值实现(含问题排查)
原代码问题排查
- 数组元素仅在循环外获取一次:
elem := x at: z只在循环前执行,循环内索引z递增后没有重新读取当前位置的元素,始终用第一个元素判断奇偶 - 循环边界错误:Smalltalk数组为1基索引,
[z < y]的条件会漏掉最后一个索引为y的元素 - 缺少偶数计数逻辑:需求为计算平均值,仅累加偶数和没有统计符合条件的偶数数量,无法完成平均值计算
- 最终仅输出总和,没有平均值计算逻辑
正确实现
方式1:使用whileTrue:循环实现
| arr arrLen currentIdx sum evenCount avg | arr := #(84 45 54). sum := 0. evenCount := 0. currentIdx := 1. arrLen := arr size. [currentIdx <= arrLen] whileTrue: [ | currentElem | currentElem := arr at: currentIdx. currentElem even ifTrue: [ sum := sum + currentElem. evenCount := evenCount + 1 ]. currentIdx := currentIdx + 1 ]. "无偶数场景做除0兼容处理" avg := evenCount > 0 ifTrue: [ sum / evenCount ] ifFalse: [ 0 ]. Transcript clear. Transcript show: '偶数平均值为: ', avg printString.
测试输出结果:偶数平均值为: 69
方式2:使用do:循环实现
| arr sum evenCount avg | arr := #(84 45 54). sum := 0. evenCount := 0. arr do: [ :currentElem | currentElem even ifTrue: [ sum := sum + currentElem. evenCount := evenCount + 1 ] ]. avg := evenCount > 0 ifTrue: [ sum / evenCount ] ifFalse: [ 0 ]. Transcript clear. Transcript show: '偶数平均值为: ', avg printString.
测试输出结果:偶数平均值为: 69
内容的提问来源于stack exchange,提问作者Syed Joy
相关产品推荐
相关产品推荐

