如何修改递归斐波那契代码使最终结果为负数?解决栈溢出与不可达问题
解决方法:正确将递归方法返回结果转为负数
首先得搞清楚你之前遇到问题的核心原因:
- 如果你在递归里执行
nv = -nv;再发起递归调用,参数会变成负数,比如原本传的是3,变成-3后,递归调用negativ(nv-1)就是negativ(-4),接着是negativ(-5)……永远触不到nv==0或nv==1的终止条件,自然会触发栈溢出。 - 把
nv = -nv;放在return之后的话,代码确实不可达——因为return语句执行后方法就直接结束了,后面的代码根本没有运行机会。
给你两种靠谱的实现方式:
方式一:直接修改递归逻辑,返回取反后的结果
把每个终止条件的返回值改成负数,递归相加的结果也取反返回:
public class FiboNegativV { int negativ(int nv) { if (nv == 0) return -1; // 原base case返回1,现在直接返回-1 if (nv == 1) return -2; // 原base case返回2,现在直接返回-2 return -(negativ(nv-1) + negativ(nv-2)); // 把递归计算的和取反 } }
这样每一步递归都会返回对应结果的负数,最终得到的就是你想要的负数值,而且递归参数还是正常递减到0或1,不会出现无限递归的问题。
方式二:用包装方法分离逻辑(更推荐)
保留原有的递归计算逻辑,新增一个对外方法负责取反,代码更清晰,也更容易维护:
public class FiboNegativV { // 私有方法负责原本的斐波那契式计算,返回正数结果 private int calculateFibo(int nv) { if (nv == 0) return 1; if (nv == 1) return 2; return calculateFibo(nv-1) + calculateFibo(nv-2); } // 对外暴露的方法,调用计算方法后返回负数结果 int negativ(int nv) { return -calculateFibo(nv); } }
这种方式把计算和取反的逻辑完全分开,原递归方法的逻辑不需要做任何改动,只需要在最后一步把结果取反即可,既安全又易读。
内容的提问来源于stack exchange,提问作者Florian Nolte
相关产品推荐
相关产品推荐

