在Pharo中实现十进制转二进制递归方法遇索引错误求助
问题分析与修复方案
错误原因
errorNotIndexable报错根源:你误用了asStringWithCommas方法,这个方法用于给大数字添加千位分隔符(比如1234 asStringWithCommas返回'1,234'),在递归处理单个数字(0或1)时,该方法内部实现触发了索引操作,而SmallInteger本身不是可索引对象,因此报错。应该用asString来将单个数字转为字符串。- 递归逻辑多处错误:
- 字符串拼接顺序颠倒:当前余数应该拼在递归结果的末尾,否则会得到反转的二进制字符串(比如输入5会得到
110而非101)。 - 未返回递归结果:
ifTrue块内的代码没有用^返回拼接后的字符串,导致执行完后继续走到错误抛出语句。 - 错误处理位置错误:无论输入是否合法,最后都会执行
self error:,导致正整数输入也会触发错误。
- 字符串拼接顺序颠倒:当前余数应该拼在递归结果的末尾,否则会得到反转的二进制字符串(比如输入5会得到
修正后的代码
decimalBinary self < 0 ifTrue: [ self error: 'Not valid for negative integers' ]. self = 0 ifTrue: [ ^ '0' ]. self = 1 ifTrue: [ ^ '1' ]. ^ (self // 2) decimalBinary , (self % 2) asString
代码说明
- 先判断负数,直接抛出错误,避免后续递归进入非法分支。
- 明确递归终止条件:数字为0或1时,直接返回对应的字符串。
- 递归时先获取高位二进制字符串(
self//2的结果),再拼接当前位的余数(self%2转字符串),保证二进制位顺序正确。 - 使用
^明确返回拼接结果,确保递归能正确传递返回值。
测试验证
输入5 decimalBinary返回'101',输入0 decimalBinary返回'0',输入-3 decimalBinary会抛出预期的错误提示。
内容的提问来源于stack exchange,提问作者decabytes
相关产品推荐
相关产品推荐

