我正在尝试制作递归算法,该算法返回将给定数字写为不同数字之和的所有可能性。
例如,如果给定的数字是(1,7)(1,2,5)(1,3,4)(2,6)(3,5)
,我的程序应该返回(1,7)(1,(2,5)(3,4))(2,6)(3,5),
。
就我工作而言,我能得到的是(对于这个例子)public String calculate(float number, float i)
{
String str = "";
float half = number / 2;
while ( i < half)
{
float diff = number - i;
str = str + "(" + i + "," + diff + ")";
if (calculate(diff, i + 1) != "")
str = str + "(" + i + "," + calculate(diff, i + 1) + ")";
i++;
}
return str;
}
并且随着给定数字的增加,组合甚至更加复杂。我怎样才能得到正确的结果而不是我的?
功能是:
calculate(number,1)
该函数的调用是var path = require('path');
var express = require('express');
var app = express();
var router = express.Router();
router.use(express.static(path.join(__dirname, '/scripts')));
router.get('*', function(request, response) {
response.sendFile(path.join(__dirname, 'views/index.html'));
});
app.use(router);
app.listen(80);
。提前感谢您的帮助!
答案 0 :(得分:0)
这是我在SO上基于Java answer的示例程序。我根据您的要求将其修改为仅显示具有不同值的总和。您可以修改它以返回连接的字符串,而不是仅仅输出总和。
class Program
{
static void Main(string[] args)
{
DisplayDistinctSums(8f);
}
static void DisplayDistinctSums(float baseNum)
{
DisplayDistinctSums(baseNum, baseNum - 1, "(");
}
static void DisplayDistinctSums(float baseNum, float nextNum, string sumString)
{
if (baseNum < 1)
{
sumString += ")";
Console.WriteLine(sumString);
return;
}
for (var i = Math.Min(nextNum, baseNum); i >= 1; i--)
{
if (!sumString.Contains(i.ToString()))
{
DisplayDistinctSums(baseNum - i, i,
sumString.Length == 1 ? sumString + i : sumString + ", " + i);
}
}
}
}
输入: 8
<强>输出:强>
(7, 1)
(6, 2)
(5, 3)
(5, 2, 1)
(4, 3, 1)