如何用递归统计正整数中2的因数个数?现有代码存在问题
修复统计正整数中2的因数个数的方法
原代码的核心问题是完全搞错了逻辑——你需要统计的是数字能被2整除的次数,却错误地用了除以3的递归条件,这也是它只对6、12这类恰好和3的倍数巧合匹配的数有效的原因。
递归实现(修正版)
public int twos(int n) { // 奇数没有2的因数,直接返回0 if (n % 2 != 0) { return 0; } // 能被2整除,就递归处理除以2后的数,同时计数+1 return twos(n / 2) + 1; }
逻辑说明:每次判断当前数是否为奇数,是则终止递归返回0;否则将数字除以2,递归调用自身并把结果加1——每一次除以2都代表找到一个2的因数,累加后就是总个数。
迭代实现(更稳妥,避免栈溢出)
如果处理极大的数字,递归可能触发栈溢出,用循环更可靠:
public int twos(int n) { int count = 0; // 只要能被2整除,就持续除以2并计数 while (n % 2 == 0) { count++; n = n / 2; } return count; }
逻辑说明:初始化计数器为0,循环检查数字是否能被2整除,每次满足条件就把计数器加1,同时将数字除以2;当数字变成奇数时,循环结束,返回最终计数。
测试验证
- 输入3(奇数)→ 返回0
- 输入6(2×3)→ 返回1
- 输入12(2²×3)→ 返回2
- 输入16(2⁴)→ 返回4
- 输入18(2×3²)→ 返回1
内容的提问来源于stack exchange,提问作者DC_Fruit
相关产品推荐
相关产品推荐

