【问题标题】:Backward recurssion向后递归
【发布时间】:2021-11-03 17:18:23
【问题描述】:

有一个任务:有几个男孩要打架,如果是偶数,他们分成两组,输了的 - 回家。他们分成两对,打架,然后有人回家,直到他们得到奇数的人。当最后奇数人离开时 - 每个人都与每一个可能的敌人战斗。公式如下: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));

但是,如果我知道战斗次数并且想知道这场战斗需要多少人,该怎么办? 反之如何执行这个函数?

【问题讨论】:

  • 第一个男孩输掉比赛后,他们不应该停止战斗吗?因为他们变得奇怪
  • 示例:12 个人 / 2 6 对战斗 - 6 个获胜者。 6 胜者争夺 - 3 胜者;最后 3 - 3(3/2)/2 = 3 6 + 3 + 3 = 12

标签: javascript algorithm recursion


【解决方案1】:

你不能轻易地逆转这个功能,至少不能完全逆转。

有三名战士,将有3 * (3 - 1) / 2,或3 战斗。有四名战士,第一轮将有2 战斗,第二轮将有1 战斗,3 战斗。因此,如果我们知道有三场战斗,我们不知道是三名还是四名战士。同样,qwe (10)15qwe (16) 也是。

有可能——事实上,从我的测试来看(直到1000000n),最多有两个输入可以产生任何给定的输出。

我们可以通过详尽的搜索找到它们,因为很容易证明qwe (n) 总是至少是n - 1,所以如果我们检查所有值的答案,最多比我们的目标值大一,我们会发现所有击中目标的人。但是由于功能如此混乱,我很难看到如何改进这种详尽的搜索。我们可以很容易地测试奇数的结果,因为qwe (n) = n * (n - 1) / 2 并且通过一些简单的代数,我们可以证明如果qwe (n) == t,那么n = (1 + sqrt (1 + 8 * t)) / 2,但测试递归步骤似乎要麻烦得多。

【讨论】:

  • 谢谢你,斯科特。你能帮我理解获得这两个值的算法吗?首先我们检查战斗数为奇数时的困难阶段:N * (N-1) / 2 = starData N^2 - N - 2*srartData = 0;我们求解这个二次方程,如果我们的 N-s 中至少有一个是正整数,我们选中这个选项。我们接下来要做什么?
  • 我回答的重点是,除了搜索小于n的值外,没有明确的算法,跟踪所有生成n的值。对于n 不到一百万,我这样做了,并找到了一个有两个答案的小数字,还有更多有一个答案,而没有更多答案的数字。也许比我更聪明的人会指出我遗漏的东西,但我看不到更好的东西。 1/2
  • 请注意,我确实在那里求解了二次方程。如果1 + 8 * t 是一个完美的正方形,那么你有一个奇数(1 + sqrt (1 + 8 * t)) / 2 的解。但这仅适用于那些从奇数人开始的人,而不是那些将参赛者切成两半,然后选择奇数的人。 2 /2
  • 如果您对此感兴趣,我已经使用解决方案 stackoverflow.com/questions/69117257/… 创建了新主题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多