关于递归使用的一些问题
本帖最后由 冥月影 于 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
的确有点迷: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);
}
}
}
mmp,写的代码自己都看不懂。。。。
全部还给老师了
递归那里 %改成/
;www神奇的使用了解构赋值,不知道java支不支持,哈哈哈哈哈哈
我tm到底写的是啥语言 递归 应该是要有返回值的,就是把这个返回值 拿到递归里面去处理,一直 处理到不能处理以后,完成递归,return出来的就是终值 本帖最后由 冥月影 于 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:08
大佬,抱歉,我有点菜,return那里改不过来,return huajian(fz/i, fm%i);这句执行 ...
不是大佬呀:lol,大佬怎么可能写出我这种四不像代码
栈溢出了,看看 是不是 递归里面死循环了,或者深度太深(应该不至于啊?)
具体可能 需要你排查 一下,究竟是哪里的问题
我的代码肯定是错的,只能说是一个参考思路 井右寺 发表于 2019-8-20 21:58
递归 应该是要有返回值的,就是把这个返回值 拿到递归里面去处理,一直 处理到不能处理以后,完成递归,ret ...
感谢大佬,根据你给的思路做出来了,谢谢 井右寺 发表于 2019-8-20 22:21
不是大佬呀,大佬怎么可能写出我这种四不像代码
栈溢出了,看看 是不是 递归里面死循环了,或者深度 ...
代码没错,把for循环那把i改成从2开始就好了,可能反着写运算次数有点多,还有,比我厉害的都是大佬。。。 冥月影 发表于 2019-8-20 22:29
代码没错,把for循环那把i改成从2开始就好了,可能反着写运算次数有点多,还有,比我厉害的都是大佬。。 ...
{:1_937:}大佬教我java,我现在忘得数组都不会写了
从2开始?
不应该是从最大公因数开始除吗?
求最大值 应该就得从 可能存在的最大值向下遍历啊 i--
如果从2开始向上,就是从最小公因素开始消,感觉 如果 分子分母是 2的N次方那不就得循环!N次?
反之,从大往小循环,就可以省很多次啊 井右寺 发表于 2019-8-20 22:39
大佬教我java,我现在忘得数组都不会写了
从2开始?
不应该是从最大公因数开始除吗?
可是反过来写会溢出。。。