冥月影 发表于 2019-8-20 21:24

关于递归使用的一些问题

本帖最后由 冥月影 于 2019-8-20 22:26 编辑

各位大佬,我表达有点菜,而且问题有点迷,可能要看完图片才能知道我想说什么,如果有空,帮忙看下,谢谢前两天刚学了一点点递归的知识,今天用递归写了一个分数化简的方法,可是和想象中有点不一样各位大佬们看,我想在得到最简的分数后就退出,可是不知道怎么设置条件,还有,那个控制循环的那个n不知道怎么取才好


代码:
package test;

public class FenShu {

        static int count = 0;
        static int fenZi = 0;
        static int fenMu = 0;
       
        public static void main(String[] args) {
                // TODO 自动生成的方法存根
//                int n = (fz < fm ? fz : fm);       
                int fz = 150, fm = 100;
                int[] fs = huajian(fz, fm);
                shuChu(fs, fs);
                System.out.println("共运行了" + count + "次");
        }
       
        /**
       * 根据大佬给的改过来的
       * @param fz
       * @param fm
       * @return
       */
        public static int[] huajian(int fz, int fm) {
                int min = fz < fm ? fz : fm;
                for(int i = 2; i < min; i++) {
                        count++;
                        if (fz%i == 0 && fm %i == 0) {               
                                return huajian(fz/i, fm/i);
                        }
                }
                int[] fs = {fz, fm};
                return fs;
        }
       
        /**
       *化简
       * @param fz 分子
       * @param fm 分母
       * @param n 取两数较小值
       */
        public static void huaJian(int fz, int fm, int n) {
                for (int i = 2; i <= n; i++) {
                        count++;
//                        if (count < 1000) {
                                System.out.println("1, fz = " + fz + ", fm = " + fm + ", n = " + n + ", i = " + i + ", count = " + count);                               
//                        }
                        if (fz % i == 0 && fm % i == 0) {
                                fz /= i;
                                fm /= i;
                                n = fz < fm ? fz : fm;               
                                fenZi = fz;
                                fenMu = fm;                       
                                huaJian(fz, fm, n);
                                System.out.println("2, fz = " + fz + ", fm = " + fm + ", n = " + n + ", i = " + i + ", count = " + count);
                        }
                }
        }
       
        public static void shuChu(int fz, int fm) {
                if(fz == fm || fm == 1) {
                        System.out.println("结果为: " + (fz / fm));
                } else {
                        System.out.println("结果为: " + fz + "/" + fm);
                }
        }
}


我用了两组数来测试,明明可以早早就结束了的,可是不知道怎么退出,还有,那个控制循环次数的,数越小消耗的次数就少,数如果较大就会出现次数需要消耗接近最小的那个数
各位大佬帮忙看下问题在哪, 谢谢
第一组, 150/100
控制循环次数用n

控制循环次数用i


第二组数 23648/2836
控制循环次数用n

控制循环次数用i

井右寺 发表于 2019-8-20 21:53

的确有点迷:Dweeqw
哈哈哈哈,忘了java怎么写了,我才是真的有点迷
package test;

public class FenShu {

      static int count = 0;
      static int fenZi = 0;
      static int fenMu = 0;
         
      public static void main(String[] args) {
                // TODO 自动生成的方法存根
                int fz = 150, fm = 100, n = (fz < fm ? fz : fm);
                fenzi,fenmu = huaJian(fz, fm);
                shuChu(fenZi, fenMu);
                System.out.println("共运行了" + count + "次");
      }

         
      /**
         *化简
         * @Param fz 分子
         * @Param fm 分母
         * @param n取两数较小值
         */
      public static arr[?抱歉,忘了java怎么写数组了] huaJian(int fz, int fm) {
            int min = fz < fm ? fz : fm;
            for(int i = min; i > 0; i --) {
                if (fz%i == 0 && fm %i == 0) {
                  return huajian(fz/i, fm%i)
                }
            }

            return {fz, fm}
      }
         
      public static void shuChu(int fz, int fm) {
                if(fz == fm || fm == 1) {
                        System.out.println("结果为: " + (fz / fm));
                } else {
                        System.out.println("结果为: " + fz + "/" + fm);
                }
      }
}

井右寺 发表于 2019-8-20 21:56

mmp,写的代码自己都看不懂。。。。
全部还给老师了
递归那里 %改成/
;www神奇的使用了解构赋值,不知道java支不支持,哈哈哈哈哈哈
我tm到底写的是啥语言

井右寺 发表于 2019-8-20 21:58

递归 应该是要有返回值的,就是把这个返回值 拿到递归里面去处理,一直 处理到不能处理以后,完成递归,return出来的就是终值

冥月影 发表于 2019-8-20 22:08

本帖最后由 冥月影 于 2019-8-20 22:10 编辑

井右寺 发表于 2019-8-20 21:56
mmp,写的代码自己都看不懂。。。。
全部还给老师了
递归那里 %改成/

大佬,抱歉,我有点菜,return那里改不过来{:1_924:},return huajian(fz/i, fm%i);这句执行时出现Exception in thread "main" java.lang.StackOverflowError

井右寺 发表于 2019-8-20 22:21

冥月影 发表于 2019-8-20 22:08
大佬,抱歉,我有点菜,return那里改不过来,return huajian(fz/i, fm%i);这句执行 ...

不是大佬呀:lol,大佬怎么可能写出我这种四不像代码
栈溢出了,看看 是不是 递归里面死循环了,或者深度太深(应该不至于啊?)
具体可能 需要你排查 一下,究竟是哪里的问题
我的代码肯定是错的,只能说是一个参考思路

冥月影 发表于 2019-8-20 22:22

井右寺 发表于 2019-8-20 21:58
递归 应该是要有返回值的,就是把这个返回值 拿到递归里面去处理,一直 处理到不能处理以后,完成递归,ret ...

感谢大佬,根据你给的思路做出来了,谢谢

冥月影 发表于 2019-8-20 22:29

井右寺 发表于 2019-8-20 22:21
不是大佬呀,大佬怎么可能写出我这种四不像代码
栈溢出了,看看 是不是 递归里面死循环了,或者深度 ...

代码没错,把for循环那把i改成从2开始就好了,可能反着写运算次数有点多,还有,比我厉害的都是大佬。。。

井右寺 发表于 2019-8-20 22:39

冥月影 发表于 2019-8-20 22:29
代码没错,把for循环那把i改成从2开始就好了,可能反着写运算次数有点多,还有,比我厉害的都是大佬。。 ...

{:1_937:}大佬教我java,我现在忘得数组都不会写了
从2开始?
不应该是从最大公因数开始除吗?
求最大值 应该就得从 可能存在的最大值向下遍历啊 i--
如果从2开始向上,就是从最小公因素开始消,感觉 如果 分子分母是 2的N次方那不就得循环!N次?
反之,从大往小循环,就可以省很多次啊

冥月影 发表于 2019-8-20 22:44

井右寺 发表于 2019-8-20 22:39
大佬教我java,我现在忘得数组都不会写了
从2开始?
不应该是从最大公因数开始除吗?


可是反过来写会溢出。。。
页: [1] 2 3 4
查看完整版本: 关于递归使用的一些问题