Java递归实现Fraction数组元素批量乘法及存在性检查
递归实现Fraction数组的检查与批量乘法操作
最近在啃Java递归的知识点,为了加深理解自己设计了个小练习:检查一个Fraction数组里是否存在1/3,如果存在的话,就把数组里所有Fraction元素都和2/1相乘。
循环版本实现
最开始我用for循环快速实现了这个功能,逻辑很直观:遍历数组每个元素,逐个执行乘法操作:
public static Fraction[] mulWithFor(Fraction[] arr) { for (int i = 0; i<arr.length; i++) { arr[i] = arr[i].multiply(new Fraction(2,1)); } return arr; }
递归版本的探索与实现
不过用递归实现的时候就踩坑了,最初写的递归代码完全没法正常工作。后来在别人的帮助下,我把功能拆分成了三个方法来实现,分别负责主逻辑判断、递归检查元素存在性、递归执行批量乘法:
主方法(逻辑入口)
public static Fraction[] mulAus(Fraction[] arr) { if(contains(arr,arr.length-1,new Fraction(1,3))) { rekurMul(arr,0); return arr; } throw new IllegalArgumentException("1/3 does not exist in the Input-Array"); }
递归乘法方法
从索引0开始,逐个处理数组元素,直到遍历完整个数组就终止递归:
public static void rekurMul(Fraction[] arr, int i) { if(i == arr.length) { return ; } arr[i] = arr[i].multiply(new Fraction(2,1)); rekurMul(arr,i+1); }
递归检查元素存在方法
从数组末尾开始往前遍历检查,只要找到匹配的1/3就返回true,遍历完所有元素都没找到就返回false:
public static boolean contains(Fraction[] arr, int i, Fraction x) { if (i>= 0 && i < arr.length) { if (arr[i].equals(x)) { return true;} else { return contains(arr, i-1,x); } } return false; }
配套的Fraction类定义
这里用到的Fraction类实现如下,包含了构造方法和分数化简逻辑:
private int numerator; // 分子 private int denominator; // 分母 public Fraction ( int num, int denom ) { if ( denom != 0 ) { if ( denom < 0 ) { numerator = -num; denominator = -denom; } else { numerator = num; denominator = denom; } reduce(); } else { // error: division by zero throw new IllegalArgumentException(); } } public Fraction() { numerator = 0; denominator = 1; } public Fraction( int num ) { numerator = num; denominator = 1; }
内容的提问来源于stack exchange,提问作者ManuelHGN
相关产品推荐
相关产品推荐

