javascript - 向后递归
问题描述
有一个任务:有几个男孩想打架,如果人数是偶数,他们分成两组,输了的人 - 回家。他们分成两对,打架,然后有人回家,直到他们得到奇数的人。当最后奇数人离开时 - 每个人都与每一个可能的敌人战斗。公式如下:n(n-1)/2。例如 5 个人 - 10 场战斗。
如果从一开始的人的数量是奇数 - 相同的计数方式:n(n-1)/ 2。
我写了一个脚本来计算所有可能的战斗次数,就像这样:
function qwe(number) {
if(number % 2) {
return number = number*(number-1)/2
} else {
number = number / 2;
return number + qwe(number)
}
}
console.log(qwe(6));
但是,如果我知道战斗次数并且想知道这场战斗我需要多少人怎么办?如何以相反的方式执行此功能?
解决方案
你不能轻易地逆转这个功能,至少不能完全逆转。
有了三个战士,就会有3 * (3 - 1) / 2
,或3
打架。有四个战士,第一轮会有2
战斗,然后1
是第二轮,为3
战斗。所以如果我们知道有三场战斗,我们不知道是三场还是四场。同样,qwe (10)
is15
和 so is qwe (16)
。
有可能——事实上,从我的测试(最多)看来n
,1000000
最多有两个输入可以产生任何给定的输出。
我们可以通过详尽的搜索找到它们,因为很容易证明它qwe (n)
总是至少n - 1
,所以如果我们检查所有值的答案,最多比我们的目标值大一,我们将找到所有达到目标的值。但是由于功能如此混乱,我很难看到如何改进这种详尽的搜索。我们可以很容易地测试奇数结果,因为qwe (n) = n * (n - 1) / 2
通过一些简单的代数,我们可以证明 if qwe (n) == t
, then n = (1 + sqrt (1 + 8 * t)) / 2
,但是测试递归步骤似乎更有问题。
推荐阅读
- ios - 视觉文本识别器给出零结果
- c# - System.Net.Http.HttpRequestException:无法向缓冲区写入比配置的最大缓冲区大小更多的字节
- flutter - 如何使用flutter_local_notifications
- apache-kafka - 找不到任何实现 Connector 且名称与 io.confluent.connect.elasticsearch.ElasticsearchSinkConnector 匹配的类
- google-apps-script - 我可以保护 Google 表格的名称吗?还是按位置而不是名称引用工作表?
- android - 已删除的视频显示在 Android Studio 代码的视频播放器中
- android - 按下其他按钮时,带有 setOnClickListener() 的按钮如何完成未完成的工作?
- laravel - laravel 中的依赖连续 crud
- python - 我们如何使用“Google Sheet API”使用 Python 使用新数据更新工作表
- linq - IEnumerable EnumerableRowCollection 之间的转换