簡體   English   中英

遞歸計划

[英]Recursion Scheme

我有一個公式,(2 ^ n)-1,我需要將它轉換為遞歸函數,我嘗試了幾次來重寫它,但我仍在苦苦掙扎。 我的代碼出了什么問題?

(define fnum(n)
    (if (= n 0) 0
        (- ( * 2 (fnum (- n 1)) 1)))

(fnum (- n 1)))

你可以這樣做( 工作示例 ):

(define pow
  (lambda (n)
    (if (= n 0)
      1
      (* 2 (pow (- n 1))))))

(display (- (pow 5) 1)) 

很明顯,您應該將動力部分與減1步驟分開,之后將執行。

您需要從減法中拆分遞歸:

(define (parent-nodes-helper n)
  (if (= n 0) 
      0
      (* 2 (parent-nodes-helper (- n 1)))))

;;; Number of parent nodes in a perfect balanced binary tree
(define (parent-nodes depth)
  (- (parent-nodes-helper depth) 1))

現在。 幫助器可以作為fnum本地,甚至可以實現為命名let ,然后你可以添加acc參數來保存結果,這樣在每次重復結束后不需要進行乘法。 這是我將如何做到這一點:

;;; Number of parent nodes in a perfect balanced binary tree
(define (parent-nodes depth)
  (let loop ((n depth) (acc 1))
    (if (zero? n) 
        (- acc 1)
        (loop (- n 1) (* acc 2)))))

在命名的let loop調用迭代尾遞歸是很常見的,但我可以保留名稱parent-nodes-helper或我發現的任何擬合。 這只是一個名字。

暫無
暫無

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

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