我有一个公式,(2^n)-1,我需要把它转换成一个递归函数,我试了几次重写它,但我仍然在努力。我的代码出了什么问题?
(define fnum(n)
(if (= n 0) 0
(- ( * 2 (fnum (- n 1)) 1)))
(fnum (- n 1)))发布于 2019-02-13 03:43:30
您可以这样做(working example):
(define pow
(lambda (n)
(if (= n 0)
1
(* 2 (pow (- n 1))))))
(display (- (pow 5) 1)) 很明显,您应该将供电部分与负1步分开,这将在随后执行。
发布于 2019-02-13 23:15:03
您需要将递归从子操作中分离出来:
(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或其他我认为合适的名称。这只是个名字。
https://stackoverflow.com/questions/54657440
复制相似问题