如何递归生成指定长度的2的幂次数组?修复现有代码问题
修复递归程序:将数组下标i元素设为2^i
原代码的核心问题是逻辑错误:每次递归时反复将前面所有元素乘2,导致最终元素值为2^(length-1 -i),和预期的2^i完全颠倒,同时冗余的循环也造成了不必要的计算。以下是修复方案:
修复后的代码
void powersOf2(int[] array) { powersOf2(array, 0); } void powersOf2(int[] array, int i) { // 递归终止条件:处理完所有元素时停止 if (i == array.length) { return; } // 计算当前下标i对应的2^i:i=0时为1,其余为前一个元素的2倍 array[i] = i == 0 ? 1 : array[i-1] * 2; // 递归处理下一个下标 powersOf2(array, i + 1); }
修复说明
- 简化递归逻辑:移除了原代码中针对数组长度为1的特殊分支,统一处理所有长度的数组。
- 修正值计算方式:利用
2^i = 2^(i-1) * 2的数学关系,直接通过前一个元素推导当前元素值,避免了错误的循环乘操作。 - 明确终止条件:当
i等于数组长度时,说明所有元素已处理完成,直接终止递归。
以数组长度为3为例,执行流程如下:
- 调用
powersOf2(array, 0):设置array[0] = 1,递归处理下标1 - 调用
powersOf2(array, 1):设置array[1] = 1*2 = 2,递归处理下标2 - 调用
powersOf2(array, 2):设置array[2] = 2*2 = 4,递归处理下标3 - 调用
powersOf2(array, 3):i等于数组长度,递归终止,最终数组为[1,2,4],符合预期。
内容的提问来源于stack exchange,提问作者Fallen_Hero
相关产品推荐
相关产品推荐

