algorithm - 递归谜题

标签 algorithm recursion

最近,我的一位 friend 向我提出挑战,要求我解决这个难题,内容如下:

假设您有两个变量 x 和 y。这些是唯一可用于存储在程序中的变量。可以执行三种操作:

  • 操作 1:x = x+y
  • 操作 2:x = x-y
  • 操作 3:y = x-y

现在,给你两个数字 n1 和 n2 以及一个目标数字 k。从 x = n1 和 y = n2 开始,有没有办法使用上述操作得出 x = k?如果是,可以生成 x = k 的运算顺序是什么?

示例:如果 n1 = 16、n2 = 6 且 k = 28,则答案为"is"。顺序是:

Operation 1
Operation 1

如果 n1 = 19、n2 = 7 且 k = 22,则答案为"is"。顺序是:

Operation 2
Operation 3
Operation 1
Operation 1

现在,我已经思考这个问题太久了,但我没有得到任何初步的想法。我有一种感觉,这是递归,但我不知道边界条件应该是什么。如果有人可以指导我找到一种可用于解决此问题的方法,那将非常有帮助。谢谢!

最佳答案

也许不是一个完整的答案,但证明序列存在当且仅当 kn1 的最大公约数 (GCD) 的倍数和n2 。让我们写G = GCD(n1, n2)为简洁起见。

首先我要证明xy始终是 G 的整数倍。这个证明通过归纳法确实很简单。假设:x = p * Gy = q * G ,对于某些整数 pq .

  • 最初,根据 G 的定义,假设成立。 .
  • 每条规则都遵循归纳假设。规则产生:
    1. x + y = p * G + q * G = (p + q) * G
    2. x - y = p * G - q * G = (p - q) * G
    3. y - x = q * G - p * G = (q - p) * G

由于这个结果,只能有一个序列到 k如果kn1 的 GCD 的整数倍和n2 .

对于另一个方向,我们需要证明 G任意整数倍可以通过规则来实现。如果我们能达到x = G,情况肯定是这样的。和y = G 。为此,我们使用 Euclid's algorithm 。考虑链接的 wiki 文章中的第二个实现:

function gcd(a, b)
    while a ≠ b
        if a > b
           a := a − b
        else
           b := b − a
    return a

这是规则 2 和 3 的重复应用,结果为 x = Gy = G .


知道存在解决方案,您可以应用 BFS,如 Amit's answer 所示,找到最短序列。

关于algorithm - 递归谜题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22503261/

相关文章:

algorithm - 根据近似距离列表计算位置

algorithm - 计算 bool 括号的实现

c - 关于c中的二进制搜索算法的问题

c++ - 如何将备忘录应用于此递归函数?

C# 从整数列表中删除项目 int[] l = {1,2,3} - 或使用递归添加它们

c - 如何在递归函数中返回或复制字符串数组?

java - 编写代码以仅使用一次 isSubstring 调用来检查 s2 是否是 s1 的旋转

c++ - 我的构建二叉树解决方案有什么问题?

c++11 - 铛。 fatal error : recursive template instantiation exceeded maximum depth

java - 循环遍历SoapMessage主体中的所有元素并返回我想要的节点