我试过但未能这样做。我可以向正确的方向努力吗?
答案 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
名称),尽管将其修正为负数并除以 - 零只是一点额外的工作。
处理标志和错误的一些提示:
-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)