微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尾递归函数中的局部函数参数输入

如何解决尾递归函数中的局部函数参数输入

我正在完成在线编码课程的最终项目,我通过使用其他问题作为模板得到了正确答案,但我无法弄清楚某些内部函数正在工作以及它们从哪里获得参数从。 (在球拍博士工作)

问题是使用一个类似于 Twitter 的社交网络,它构建在一个循环的arb-arity 树/图中,目标是产生一个带有尾递归的函数,用 Chirper 确定拥有最多的追随者。

给定:

(define-struct chirper (n v loc))

其中 n 是用户名--字符串; v 是否“已验证?”-- 布尔值; loc 是关注者 -- (listof Chirper)

(define SN2
  (shared ((-A- (make-chirper "Chirper1" false (list -B- -C-)))
           (-B- (make-chirper "Chirper2" true  (list -A- -C-)))
           (-C- (make-chirper "Chirper3" true  empty))
           )
    -A-)) 
(check-expect (most-followers SN2)
              (shared ((-A- (make-chirper "Chirper1" false (list -B- -C-)))
                       (-B- (make-chirper "Chirper2" true  (list -A- -C-)))
                       (-C- (make-chirper "Chirper3" true  empty))
                       )
                -C-))

当下面的代码被执行时,上面的检查期望给出正确的答案-C-

(define (most-followers c0)
  (local [(define-struct unf (c f)) 
          (define (fn-for-c c todo visited rsf)
            (if (member (chirper-n c) visited)
                (fn-for-loc todo visited rsf)
                (fn-for-loc (append (chirper-loc c) todo)
                            (cons (chirper-n c) visited)
                            (merge-chirper c rsf))))                    

          (define (fn-for-loc todo visited rsf)
            (cond [(empty? todo) rsf]
                  [else
                   (fn-for-c (first todo) (rest todo) visited rsf)]))

          (define (merge-chirper c rsf)                                   
            (foldr merge-worklistentry rsf (chirper-loc c)))              
                                                                                    
          (define (merge-worklistentry c lounf)   
            (cond [(empty? lounf) (list (make-unf c 1))]                               
                  [else                                                               
                   (if (string=? (chirper-n c) (chirper-n (unf-c (first lounf))))      
                       (cons (make-unf c (add1 (unf-f (first lounf)))) (rest lounf))
                       (cons (first lounf) (merge-worklistentry c (rest lounf))))]))   
          
          (define (pick-max rsf)
            (unf-c
             (foldr (λ (e1 e2)
                      (if (> (unf-f e1) (unf-f e2))
                          e1
                          e2))
                    (first rsf)
                    (rest rsf))))]
   
    (pick-max (fn-for-c c0 empty empty empty))))

当我尝试逐步解决问题时,我对调用 (merge-chirper c rsf) 的位置感到困惑。对于 'merge-chirper',我使用了 foldr 函数,其中 f = merge-worklistentry,base 是 rsf(第一次迭代时为空),而 lox = (listof Chirper) 来自 c。

据我所知,(foldr f base (list x-1 ... x-n)) = (f x-1 ... (f x-n base)) 对于 (define (foldr f base lox) ...).

对整个函数使用 -A- 和基本情况,(merge-worklistentry) 中的给定参数是什么?是''和'list -B- -C-'吗?如果不是,论据是什么?它们从何而来?

假设我的输入是正确的,当我在纸上逐步查看 (merge-chirper c rsf) 的结果时,我得到 (list (-B-,1) ( -C-,1)),是吗?如果是,那么 merge-worklistentry 的第二次调用中的“lounf”来自哪里?因为 foldr 函数只是将该列表添加到新列表的末尾,在 -B- 的情况下,它将给出另一个列表项 (-C-,1),而不是将其增加到 (-C-,2)。我完全不明白:(

我只是对在调用之间存储/保留这些数据的位置/方式感到非常困惑,而且我无法在 Dr. Racket 中逐步完成它,因为对于图形/循环树,我必须使用“高级”学生的语言设置并禁用步进器。

如果有人可以通过适当的检查点逐步完成上述场景,我想我可以更好地掌握该过程。谢谢!!!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。