我第一次参加计划和&我正在尝试编写一个简单的递归函数,它将使用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.
}
}
答案 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)))))