首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归方案

递归方案
EN

Stack Overflow用户
提问于 2019-02-13 03:32:44
回答 2查看 69关注 0票数 3

我有一个公式,(2^n)-1,我需要把它转换成一个递归函数,我试了几次重写它,但我仍然在努力。我的代码出了什么问题?

代码语言:javascript
复制
(define fnum(n)
    (if (= n 0) 0
        (- ( * 2 (fnum (- n 1)) 1)))

(fnum (- n 1)))
EN

回答 2

Stack Overflow用户

发布于 2019-02-13 03:43:30

您可以这样做(working example):

代码语言:javascript
复制
(define pow
  (lambda (n)
    (if (= n 0)
      1
      (* 2 (pow (- n 1))))))

(display (- (pow 5) 1)) 

很明显,您应该将供电部分与负1步分开,这将在随后执行。

票数 2
EN

Stack Overflow用户

发布于 2019-02-13 23:15:03

您需要将递归从子操作中分离出来:

代码语言:javascript
复制
(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参数来保存结果,这样就不需要在每次重复结束后执行乘法。以下是我将如何做到这一点:

代码语言:javascript
复制
;;; 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或其他我认为合适的名称。这只是个名字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54657440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档