我的任务是用Java语言编写一个方法来计算第一个N
正数的和。但是我不能使用任何循环(如for
、do-while
等),我也不能使用迭代。后者背后的原因是它占用了大量的堆空间,甚至在开始任何计算之前都是如此。我也不会用乘法。
它们有自己的不可变的Number
类,我必须返回这个类,并且有0
和1
的实例。我不能创建任何新实例,但我可以添加两个实例并获得结果。
例如,我不能只返回n * (n + 1) / 2
,因为乘法是被禁止的。我甚至尝试过用加对数做乘法,但是即使我有答案,我也不能返回它,因为我不能创建相应的Number
实例。所以我想我必须使用Number
附带的加法函数。
我应该通过创建一些我编写的不可变类的实例来解决这个问题,并将小计传递给新的实例。那很清楚了。我不清楚的是,在结束时,我仍然需要使用一些循环或某种递归,不是吗?还是有别的办法?
编辑:这是Number
:https://pastebin.com/N8WNvmxK的代码(Number
在f
包中,我根本不能修改它)
更新:事实证明,我可以利用他们提供的类中的一个方法,因为它有一个while循环。这样我就可以进行迭代了。
发布于 2018-05-28 20:41:42
您应该返回(N*(N+1))/2
,但这不是一个java编程问题,而是一个基本的数学问题。
发布于 2018-05-28 20:55:36
我猜你的主要问题实际上不是计算答案,而是有效地构造它(其他答案清楚地显示了你可以用于计算的公式)。
您可以使用二进制表示法构造数字,并为二进制表示法的每个1
生成中间部分数。
假设从1
到10
的总和是55
,它的二进制形式是110111
(32
+ 16
+ 4
+ 2
+ 1
)。你可以通过将前一个的两个副本相加,然后累加成最终结果,来计算每个所需的2的幂。
发布于 2018-05-28 20:44:47
使用公式将前n个自然数求和为:((n**2)+n)/2
根据您的需要用Java或任何语言编写代码。
sum = ((n*n)+n)/2;
参考:https://trans4mind.com/personal_development/mathematics/series/sumNaturalNumbers.htm
https://stackoverflow.com/questions/50566681
复制相似问题