使用连续减法划分两个数字的递归函数

时间:2009-11-24 06:02:04

标签: c

我试过但未能这样做。我可以向正确的方向努力吗?

1 个答案:

答案 0 :(得分:8)

我首先要强调的是,这通常是递归的一个非常糟糕的用法。最好的递归解决方案倾向于相当快地减少解决方案的“搜索空间”,例如二进制搜索在每次迭代时删除剩余搜索空间的一半。

如果减数与minuend相比相对较小(minuend - subtrahend给你差异),则重复减法会产生很多递归调用,很可能耗尽你的堆栈空间。


话虽如此,下面的解决方案只是伪代码,因为它可能是作业:

def divu (a, b):
    if a < b return 0
    return divu (a - b, b) + 1

通过从b重复减去a并向下移动一个级别,直到您无法再从b减去a而不会消极为止。然后它返回递归树,为你下降的每个级别添加1。

这仅适用于a的非负值和b的正值(因此是无符号的divu名称),尽管将其修正为负数并除以 - 零只是一点额外的工作。

处理标志和错误的一些提示:

  • 如果b等于零则直接检测并退出并显示错误,异常或其他某种机制。
  • -a / -b视为a / b
  • -a / b视为-(a / b)
  • a / -b视为-(a / b)
  • 否则,只需要解决a / b

可以在单个递归调用中处理这些特殊情况,但它会在每个级别的递归中添加不必要的检查。提供检查函数div可能更有效,然后可以调用divu来执行递归位,例如:

def div (a, b):
    if b == 0
        exit with error
    if a < 0 and b < 0:
        return divu (-a, -b)
    if a < 0:
        return -divu (-a, b)
    if b < 0:
        return -divu (a, -b)
    return divu (a, b)