两个n位数的递归除法算法

时间:2017-01-25 17:32:01

标签: algorithm recursion

在下面的除法算法中,我无法理解为什么将q和r乘以两个作品,以及为什么r在x为奇数时递增。

请给出这种递归除法算法的理论依据。

提前致谢。

function divide(x, y) 
   if x = 0: 
      return (q, r) = (0, 0) 
   (q, r) = divide(floor(x/2), y) 
   q = 2q, r = 2r 
   if x is odd: 
      r = r + 1 
   if r ≥ y: 
      r = r − y, q = q + 1
   return (q, r)

2 个答案:

答案 0 :(得分:2)

我们假设您要将df = df.fillna("") groups = df.groupby("parent_id") parents = groups.get_group("") for p_id, p in p.iterrows(): grp = groups.get_group(p_id) do_something(p, grp) 除以x,即代表y

我们假设x = Q * y + R是偶数。您递归地将x除以x / 2并获得所需的小型案例代表:y

通过将它乘以2,您将获得:x / 2 = q * y + r。看一下你想要获得x = 2q * y + 2r的表示,你会看到你找到了它!让xQ = 2q找到所需的R = 2rQ

如果R是奇数,您再次首先获得较小案例的所需表示:x,将其乘以2:(x - 1) / 2 = q * y + r,并将x - 1 = 2q * y + 2r发送给右:1。您再次找到了您想要的x = 2q * y + 2r + 1QRQ = 2q

算法的最后部分只是标准化,因此R = 2r + 1。当你将乘法乘以2时,r < y可能会大于r

答案 1 :(得分:0)

算法 PuzzleSolve(k,S,U) : 输入:一个整数 k、序列 S 和集合 U 输出:使用 U 中的元素不重复地枚举 S 的所有 k 长度扩展 对于 U 中的每个 e 在 S 末尾添加 e 从 U 中删除 e /e is now being used/ 如果 k == 1 那么 测试 S 是否是解决难题的配置 如果 S 解决了这个难题,那么 return "找到解决方案:" S 别的 PuzzleSolve(k-1,S,U) /递归调用/ 从 S 的末尾删除 e 将 e 添加回 U e 现在被视为未使用 该算法枚举 U 的每个可能的大小为 k 的有序子集,并测试每个子集是否为 我们的难题的可能解决方案。对于求和题,U = 0,1,2,3,4,5,6,7,8,9 和每个位置 在序列中对应于一个给定的字母。例如,第一个位置可以代表 b, 第二个是 o,第三个是 y,依此类推。