计算pi&的一系列近似值方案语法

时间:2017-01-17 23:49:51

标签: syntax scheme racket pi

我第一次参加计划和&我正在尝试编写一个简单的递归函数,它将使用Leibniz formula计算pi。该过程采用所需的准确度并返回适当的pi近似值。

例如:make-pi 0.001 - > 3.14109 ...

我开始接受语法,但是在语法中以及在方案中调用/返回变量的正确方法都会丢失。

model: function() {

        //Get current user's uid
        const uid = this.get('session.currentUser.uid');

        //Inject Firebase Auth
        const auth = this.get('firebaseApp').auth();
        var user = auth.currentUser;

        //Inject Firebase Database
        const database = this.get('firebaseApp').database();

        if (user) {
            // User is signed in.
            var schoolIdRef = database.ref('/users/' + uid).once('value').then(function(snapshot) {
                var schoolId = snapshot.val().schoolId;
                console.log(schoolId);
                // ...
            });
            console.log(schoolId);
            return this.store.query('schools', {
                //Query specific school ID
                equalTo: "0" //SET THIS TO schoolId SOMEHOW
            });
        } else {
            // No user is signed in.
        }

    }

2 个答案:

答案 0 :(得分:2)

如何调用变量。假设符号add通过将它们括在括号中来评估您调用的过程:

(add 1 2) ; returns 3 if `add` is like global variable `+`

基本上它是Algol语言中add(1, 2)的语义等价。 注意不要使用额外的括号,因为((add 1 2))与add(1, 2)()等相同。

如何返回变量。好吧,你让它成为尾部表达。

(define (positive? n)
  (if (> 0 n)
      #t         ; tail that returns true 
      #f))       ; tail that returns false

实际上会发生的是if根据测试做出结果或替代方案。因此整个if形式的结果变为true或false,if也返回该值。最终,if表达式的最后一个表达式将作为positive?的结果返回。

使用define

制作全局变量
(define my-value 10) ; my-value is 10

当然,程序是一个价值:

(define add1 (lambda (n) (+ n 1))) ; value of add1 is a procedure

但是(define sign (count))将创建变量sign作为调用没有参数的过程count的结果。 var sign = count();(define check-accuracy lambda)var checkAccuracy = lambda;相同,可能不受约束。

(((- 3.14159265358979 sum) < (abs(accuracy)))))与以下内容相同: sub( 3.14159265358979, sum)(some-variable-<, abs(accuracy()))()

在Scheme中,您可能需要(< (- 3.14159265358979 sum) (abs accuracy))

过程内的define(帮助程序)需要位于过程主体之前的开头。例如。

(define (fibonacci n)
  ; define a local helper procedure
  (define (helper n a b)
    (if (zero? n)
        a
        (helper (- n 1) b (+ a b))))

  ; use the helper
  (helper n 0 1))

由于(define (proc arg ...) body ...)(define proc (lambda (arg ...) body ...))相同,您可以写相同的内容:

(define fibonacci (lambda (n)
  ; define a local helper procedure
  (define helper (lambda (n a b)
    (if (zero? n)
        a
        (helper (- n 1) b (+ a b)))))

  ; use the helper
  (helper n 0 1)))

不使用自由变量的助手可以是全局的。他们更容易以自己的方式进行测试。您可以稍后(或不是)将它们作为助手移动到内部

(sign 1) ; ==> is it 0?

记得花点时间学习这门语言。这可能是您第二次学习新语言,与学习您已经掌握的语言的新方言不同。

答案 1 :(得分:1)

也可以使用名为let&#39;用于递归(参见描述的内联注释):

(define (myfn acc)
  (let loop ((sum 0)                           ; starting values
             (denom 1)
             (sign 1))
    (if (< (abs (- 3.14159265358979 sum))      ; check accuracy
           (abs acc))
        (exact->inexact sum)                   ; if accurate, end with output
        (loop (+ sum (* 4 sign (/ 1 denom)))   ; else loop again with next values
              (+ 2 denom)                     
              (if (= sign 1)-1 1)))))