• SICP_3.5-3.6


      1 (#%require (only racket/base random))
      2 
      3 ;;;;;;;;;3.5
      4 (define (estimate-integral expriment x1 x2 y1 y2 trials)
      5   (let ((length (abs (- x2 x1)))
      6         (high (abs (- y2 y1))))
      7     (* (* high length) (monte-carlo trials expriment))))
      8 
      9 (define (monte-carlo trials expriment)
     10   (define (iter trials-remaining trials-passed)
     11     (cond ((= trials-remaining 0)
     12           (/ trials-passed trials))
     13           ((expriment)
     14            (iter (- trials-remaining 1) (+ trials-passed 1)))
     15           (else
     16            (iter (- trials-remaining 1) trials-passed))))
     17   (iter trials 0))
     18 
     19 ;(define p1
     20 ;  (let ((x (random-in-range -1 1))
     21 ;        (y (random-in-range -1 1)))
     22 ;    (<= (+ (square x) (square y)) 1)))
     23 (#%require (only racket/base random))
     24 
     25 ;;;;;;;;;3.5
     26 (define (estimate-integral expriment x1 x2 y1 y2 trials)
     27   (let ((length (abs (- x2 x1)))
     28         (high (abs (- y2 y1))))
     29     (* (* high length) (monte-carlo trials expriment))))
     30 
     31 (define (monte-carlo trials expriment)
     32   (define (iter trials-remaining trials-passed)
     33     (cond ((= trials-remaining 0)
     34           (/ trials-passed trials))
     35           ((expriment)
     36            (iter (- trials-remaining 1) (+ trials-passed 1)))
     37           (else
     38            (iter (- trials-remaining 1) trials-passed))))
     39   (iter trials 0))
     40 
     41 ;(define p1
     42 ;  (let ((x (random-in-range -1 1))
     43 ;        (y (random-in-range -1 1)))
     44 ;    (<= (+ (square x) (square y)) 1)))
     45 
     46 (define p
     47   (lambda ()
     48     (let ((x (random-in-range 0 2))
     49           (y (random-in-range 0 2)))
     50       (>= 1 (+ (square (- x 1)) (square (- y 1)))))))
     51 
     52 (define (random-in-range low high)
     53   (let ((range (- high low)))
     54     (+ low (random range))))
     55 
     56 (define square
     57   (lambda (x) (* x x)))
     58 
     59 (exact->inexact (estimate-integral p 0 2 0 2 1000))
     60 
     61 ;;;;;;;;3.6
     62 (define rand-init 1)
     63 
     64 (define rand-update
     65   (lambda (x)
     66     (+ x 1)))
     67 
     68 (define rand
     69   (let ((x rand-init))
     70     
     71     (define reset
     72       (lambda (value)
     73         (set!  x value)))
     74 
     75     (define generate
     76         (begin(set! x (rand-update x))
     77         x))
     78 
     79     (define (dispatch x)
     80       (cond ((eq? x 'generate) generate)
     81             ((eq? x 'reset) reset)
     82             (else (error "No such method -- rand" a))))
     83     dispatch))
     84 
     85 (define rand1 
     86    (let ((x rand-init)) 
     87      (define (dispatch message) 
     88        (cond ((eq? message 'generate) 
     89                (begin (set! x (rand-update x)) 
     90                       x)) 
     91              ((eq? message 'reset) 
     92                (lambda (new-value) (set! x new-value))))) 
     93      dispatch))
     94 
     95 (define rand2
     96   (let ((x rand-init))
     97     (define (generate)
     98       (set! x (rand-update x))
     99       x)
    100     (define (reset n)
    101       (set! x n))
    102     (define (dispatch a)
    103       (cond ((eq? 'generate a) (generate))
    104             ((eq? 'reset a) reset)
    105             (else (error "No such method -- rand" a))))
    106     dispatch))
    107 
    108 
    109 
    110 ;(rand 'generate)
    111 ;(rand 'generate)
    112 ;(rand 'generate)
    113 ;((rand 'reset) 3)
    114 ;(rand 'generate)
    115 
    116 (rand2 'generate)
    117 (rand2 'generate)
    118 (rand2 'generate)
    119 ((rand2 'reset) 3)
    120 (rand2 'generate)

    1.被注释掉的p 不是一个过程,而是一个值 如果把rand-in-range 放后面会报错

    2.也是同样的情况被注释掉的rand过程中 我试图直接把generate做成一个值,但是总是得不到正确的结果,

    我想可能是因为,当generate 为数值时,它的数值的取决于rand中的x,而在这里就会 出现 x一直为

    rand-init。如果把generate 做成一个无参过程,除了开始之外就不会依赖于rand 中的x了,从而每次都会update

    自己的x了,可能和作用域有关

    Yosoro
  • 相关阅读:
    python-pyStrich条形码模块
    js原型及原型链解析
    解决Genymotion下载device时较慢的问题
    nodejs实现OAuth2.0授权服务
    Swagger文档添加file上传参数写法
    TypeScript学习笔记之类
    TypeScript学习笔记之接口类型
    win64环境下使用curl命令
    TypeScript学习笔记之基础类型
    WebRTC介绍及简单应用
  • 原文地址:https://www.cnblogs.com/tclan126/p/6531978.html
Copyright © 2020-2023  润新知