首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向此方案函数添加计数器

如何向此方案函数添加计数器
EN

Stack Overflow用户
提问于 2021-05-10 22:19:50
回答 2查看 190关注 0票数 0

我想添加一个计数器,这样我就可以看到迭代运行了多少次:

代码语言:javascript
复制
(define tolerance 0.01)
(define (close-enough? x y) (< (abs (- x y)) 0.001))

(define (fixed-point function starting-guess)
  (define iter-count 0)
  (define (evaluate num)
    ; these lines increment the counter using set!
    (set! iter-count (+ iter-count 1))
    (display iter-count) (display " - ") (display num) (display "\n")
    (let ((next-num (function num)))
      (if (close-enough? num next-num)
          next-num
          (evaluate next-num))))
  (evaluate starting-guess))

(fixed-point cos 1.0)

做这件事的正确方法是什么?目前,我已经添加了一个define和一个set!,因为我无法找到让let工作的方法。是否有一种使用let来实现此操作的方法,或者建议的方法是什么?

或者,我认为另一种方法是将它作为参数传递给迭代函数本身:

代码语言:javascript
复制
(define (fixed-point function starting-guess)
  (define (evaluate num iteration-num)
    (display iteration-num) (display " - ") (display num) (display "\n")
    (let ((next-num (function num)))
      (if (close-enough? num next-num)
          next-num
          (evaluate next-num (+ 1 iteration-num)))))
  (evaluate starting-guess 0))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-10 22:53:36

就像num一样,您只需向循环函数中添加一个参数:

代码语言:javascript
复制
(define (fixed-point function starting-guess)
  ;; prints progress
  (define (print-progress iter-count)
    (display iter-count)
    (display " - ") 
    (display num)
    (newline)) 

  ;; main calculating loop 
  (define (evaluate num iter-count)
    (print-progress iter-count)
    (let ((next-num (function num)))
      (if (close-enough? num next-num)
          next-num
          (evaluate next-num (+ iter-count 1)))))

  ;; start process with iter-count 1 since 
  ;; we do increments after display
  (evaluate starting-guess 1))

请注意,您的版本开始显示0,而set!版本则从1开始。为此,我从1开始,而不是0

通过将功能添加到fixed-point中,可以完全避免副作用。

代码语言:javascript
复制
;; pure functional fixed-point
(define (fixed-point function starting-guess)
  (define (evaluate num)
    (let ((next-num (function num)))
      (if (close-enough? num next-num)
          next-num
          (evaluate next-num))))
  (evaluate starting-guess))
    
;; makes a version of function that 
;; reports its first argument and 
;; number of times it's been called
(define (count-and-brag-calls f)
  ;; brag does whatever and
  ;; return the value
  (define (brag v c)
    (display c)
    (display " - ") 
    (display v)
    (newline)
    v) 

  ;; actual implementation
  (let ((count 0))
    (lambda (n)
      (set! count (+ count 1))
      (brag (f n) count))))

;; with verbose output
(fixed-point (count-and-brag-calls cos) 1.0)

;; without side effects gives exact same result without output
(fixed-point cos 1.0)
票数 3
EN

Stack Overflow用户

发布于 2021-05-14 18:49:16

对于最小的编辑,只需将计数器的定义(绑定)移动到顶层,每次调用fixed-point之前重新设置计数器

代码语言:javascript
复制
(define iter-count 0)  ;; here

(define (fixed-point function starting-guess)
  ;; (define iter-count 0)  ;; commented-out
  ....
  ....
  )

(begin
  (set! iter-count 0)
  (fixed-point ... ... ))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67478308

复制
相关文章

相似问题

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