簡體   English   中英

使用連續減法將兩個數相除的遞歸函數

[英]Recursive function that divides two numbers, using successive subtraction

我已經嘗試過,但是沒有成功。 我可以朝正確的方向推進嗎?

我首先要強調的是,這通常對於遞歸來說是一個非常糟糕的用法。 最好的遞歸解決方案往往會相當快地減少解決方案的“搜索空間”,例如二進制搜索每次迭代都會刪除一半的剩余搜索空間。

如果subtrahend與minuend相比較小(其中minuend - subtrahend為您帶來了區別),則重復減法將導致大量遞歸調用,並且很可能會耗盡堆棧空間。


話雖如此,以下解決方案僅是偽代碼,因為它可能是家庭作業:

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

它通過反復減去ba和下降的水平,直到你再也不能減去ba沒有去負。 然后,它返回遞歸樹,為您進入的每個級別加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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM