递归方案



我有一个公式,(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或任何我认为合适的名称。这只是一个名字。

最新更新