吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1989|回复: 38
收起左侧

[已解决] 关于递归使用的一些问题

 关闭 [复制链接]
冥月影 发表于 2019-8-20 21:24
本帖最后由 冥月影 于 2019-8-20 22:26 编辑

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


代码:
[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 n = (fz < fm ? fz : fm);	
		int fz = 150, fm = 100;
		int[] fs = huajian(fz, fm);
		shuChu(fs[0], fs[1]);
		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
Lily_Screenshot_1566307837.png
控制循环次数用i
Lily_Screenshot_1566306133.png

第二组数 23648/2836
控制循环次数用n
Lily_Screenshot_1566307865.png
控制循环次数用i
Lily_Screenshot_1566306107.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

井右寺 发表于 2019-8-20 21:53
的确有点迷
哈哈哈哈,忘了java怎么写了,我才是真的有点迷
[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 + "次");
        }

         
        /**
         *  化简
         * [url=home.php?mod=space&uid=952169]@Param[/url] fz 分子
         * [url=home.php?mod=space&uid=952169]@Param[/url] 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,写的代码自己都看不懂。。。。
全部还给老师了
递归那里 %改成/
神奇的使用了解构赋值,不知道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那里改不过来,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);这句执行 ...

不是大佬呀,大佬怎么可能写出我这种四不像代码
栈溢出了,看看 是不是 递归里面死循环了,或者深度太深(应该不至于啊?)
具体可能 需要你排查 一下,究竟是哪里的问题
我的代码肯定是错的,只能说是一个参考思路
 楼主| 冥月影 发表于 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开始就好了,可能反着写运算次数有点多,还有,比我厉害的都是大佬。。 ...

大佬教我java,我现在忘得数组都不会写了
从2开始?
不应该是从最大公因数开始除吗?
求最大值 应该就得从 可能存在的最大值向下遍历啊 i--
如果从2开始向上,就是从最小公因素开始消,感觉 如果 分子分母是 2的N次方那不就得循环!N次?
反之,从大往小循环,就可以省很多次啊
 楼主| 冥月影 发表于 2019-8-20 22:44
井右寺 发表于 2019-8-20 22:39
大佬教我java,我现在忘得数组都不会写了
从2开始?
不应该是从最大公因数开始除吗?

可是反过来写会溢出。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-10 07:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表