Java奇数对应偶数连乘序列的递归实现问题求助
代码错误排查:奇数n的连乘计算问题
先看你提供的代码:
public static int calculate(int n){ if (n <= 1) { return 1; } else if (n >= 2 && n%2 == 0){ return (n * calculate(n - 2)); } else if (n >= 3 && n%2 == 1){ return n-1 * calculate(n-2); } else { return n; } }
你的需求是:当n为奇数时,计算序列 (n-1) * (n-3) * (n-5)..... * 2,比如n=9时得到8642,n=11时得到1086...*2。
问题根源
出错的那行return n-1 * calculate(n-2)是运算符优先级导致的问题:Java中乘法(*)的优先级高于减法(-),所以这行代码实际执行的是 n - (1 * calculate(n-2)),完全不符合你需要的(n-1) * calculate(n-2)逻辑。
修正方案
给n-1加上括号,明确运算顺序:
return (n-1) * calculate(n-2);
修正后的完整代码:
public static int calculate(int n){ if (n <= 1) { return 1; } else if (n >= 2 && n%2 == 0){ return (n * calculate(n - 2)); } else if (n >= 3 && n%2 == 1){ return (n-1) * calculate(n-2); } else { return n; } }
测试验证:
- 当n=9时,递归会依次计算
8*calculate(7)→8*6*calculate(5)→8*6*4*calculate(3)→8*6*4*2*calculate(1),最终得到8*6*4*2*1=384,符合预期。 - 当n=11时,会得到
10*8*6*4*2*1=3840,也符合需求。
可选优化
可以合并分支逻辑,让代码更简洁:不管n是奇数还是偶数,都取当前的最大偶数参与计算,避免多分支判断出错:
public static int calculate(int n){ if (n <= 1) { return 1; } int current = n % 2 == 0 ? n : n-1; return current * calculate(current - 2); }
内容的提问来源于stack exchange,提问作者wdwizzard
相关产品推荐
相关产品推荐

