java语法错_java – 我的语法错了,我这样做有效吗?

在您的prime函数中,有四种可能的代码路径,其中一种不返回任何内容.这就是错误消息所抱怨的内容.你需要替换:

prime (a, b-1) ;

有:

return prime (a, b-1) ;

在else if(b> 1)的情况下.

话虽如此,这实际上并不是计算数字是否为素数的好方法.问题是每个递归调用都会分配一个堆栈帧,如果你想弄清楚99,999,999是素数,你会遇到严重的堆栈溢出问题吗?

对于某个问题子集,递归是一个非常好的工具,但您需要了解堆栈深度.对于更有效的解决方案,您可以执行许多测试来确定数字不是素数,然后只用蛮力测试检查其他数字.

您应该注意的一件事是首先检查较小数字的可分性,因为这会更快地缩小您的搜索范围.并且不要使用乘法所做的除法,乘法通常更快(尽管不总是).

还有一些可能是偷偷摸摸的伎俩:

>除了2以2,4,6,8或0结尾的每个数字都是非素数.

> 5以5之外的每个数字都是非素数.

仅这两项规则将使您的搜索空间减少60%.假设您将测试编号作为字符串,即使在转换为整数类型之前,测试该字符串的最后一位数字也是一件简单的事情.

可行性检查有一些更复杂的规则.如果您取9的倍数并将所有数字相加以得到一个新数字,然后再次执行该数字,然后继续直到您有一个数字,您将发现它总是9.

这将使您的搜索空间再减少10%,尽管需要更加耗时的检查.请记住,这些检查仅对非常大的数字有利.例如,32位整数的优点并不是很大,因为预先计算的位图在那里会更有效(见下文).

为了简单起见,我将使用以下迭代解决方案:

public static boolean prime (int num) {

int t = 2;

while (t * t <= num) {

if ((num % t) == 0) {

return false;

}

t++;

}

return true;

}

如果您想在代码中获得真正的速度,请不要每次都计算它.计算一次,在您感兴趣的范围内创建所有素数的位数组(其中一个筛选方法将执行此操作),然后只需根据该位数组检查您的值.

如果您甚至不希望每次程序启动时计算数组的成本,请执行一次并将位数组保存到磁盘文件,并在程序启动时加载它.

我实际上有一个文件中前100万个素数的列表,使用grep来查找数字是否为素数比使用一些代码来计算它更容易,更快:-)

至于为什么你的算法(用return语句修复)坚持7不是素数,它会坚持每个数字都是非素数(没有用负数检查,我很确定它们会引起一些严重的问题 – 你的第一次检查应该是if(a< 1)......). 让我们来看看你打电话给素数会发生什么(3,3). 第一次通过,它命中第三个条件所以调用prime(3,2). 然后它达到第二个条件,因为3%(2-1)== 0为真(N%1总是0). 所以它返回false.这可能可以通过将第三个条件更改为else来解决,如果(b> 2),尽管我没有彻底测试过,因为我认为递归解决方案无论如何都不是一个好主意. 以下完整的代码片段将满足您的需求,尽管我很高兴您想知道自己做错了什么.这是一个真正想要成为优秀代码切割者的人的标志.

public class prime

{

public static boolean isPrime (int num) {

int t = 2;

while (t * t <= num) {

if ((num % t) == 0) {

return false;

}

t++;

}

return true;

}

public static void main (String[] arg)

{

System.out.println (isPrime (7)) ;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值