這次主要想通過幾個sicp的題目來說明遞迴計算過程和迭代計算過程。
(1)階乘
;遞迴計算過程
(define (factorial n)
(if (= n 1)
1(* (factorial (- n 1)) n)))
;迭代計算過程
(define (fact-iter counter result)
(if (= counter 1)
result
(fact-iter (- counter 1) (* counter result))))
(define (factorial n)
(fact-iter n 1))
(2)斐波拉契數列(普通方法)
;遞迴計算過程(cond 可以模擬為c++中的switch,只是它還可以判斷範圍)
(define (fib n)
(cond
((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))
;迭代計算過程
(define (fib-iter n a b)
(if (= n 0)
a(fib-iter (- n 1) b (+ a b))))
(define (fib n)
(fib-iter n 0 1))
(3)兩個正整數加法(假設存在過程inc(遞增1)和過程dec(遞減1))
;n++
(define (inc n)
(+ n 1))
;n--
(define (dec n)
(- n 1))
;遞迴計算過程
(define (+ a b)
(if (= 0 a)
b(inc (+ (dec a) b))))
;迭代計算過程
(define (+ a b)
(if (= a 0)
b(+ (dec a) (inc b))))
(4)兩個正整數乘法(假設存在過程double(翻倍)和過程halve(減半),基於這個兩個已存在的過程,這個演算法可以在對數步驟求出結果)
;2*n
(define (double n)
(* n 2))
;n/2
(define (halve n)
(/ n 2))
;判斷是否為偶數
(define (even? n)
(= 0 (remainder n 2)))
;需要注意的是:當b為偶數時, a*b = 2 * (a * (b / 2));當b為奇數時, a*b = a*(b-1) + a
;遞迴計算過程
(define (* a b)
(cond
((= b 0) a)
((even? b) (double (* a (halve b))))
(else (+ a (* a (- n 1))))))
;迭代計算過程
(define (*-iter a b result)
(cond
((= b 0) result)
((even? b) (*-iter (double a) (halve b) result))
(else (*-iter a (- b 1) (+ a result)))))
(define (* a b)
(*-iter a b 0))
(5)求冪b^n(對數步驟)
;n^2
(define (square n)
(* n n))
;需要注意的是:當n為偶數時, b^n = (b^(n/2))^2;當n為奇數時, b^n = b^(n-1) * b
;遞迴計算過程
(define (fast-expt b n)
(cond
((= n 0) 1)
((even? n) (square (fast-expt b (/ n 2))))
(else (* b (fast-expt b (- n 1))))))
;迭代計算過程
(define (fast-expt-iter b n result)
(cond
((= n 0) result)
((even? n) (fast-expt-iter (square b) (/ n 2) result))
(else (fast-expt-iter b (- n 1) (* b result)))))
(define (fast-expt b n)
(fast-expt-iter b n 1))
(6)斐波拉契數列(對數步驟)
;這個演算法基於一種比較巧妙的變換規則,用類似於fast-expt的方式壓縮求解步驟。
;在fib-iter普通演算法中,計算過程中的變換方式為a=b, b=a+b, 將此看作為t變換,也就是說fib通過n次t變換就可以得到結果。
;而t變換可以看作是變換族tpq中p=0且q=1的特殊情況,其中a = a*p + b*q, b = a*q + b*q + b*p
;可以證明我們應用tpq變換兩次,等同於應用tp'q'變換一次,其中p' = p*p + q*q, q' = 2*p*q + q*q
;迭代計算過程
(define (fib-iter n a b p q)
(cond
((= n 0) a)
((even? n) (fib-iter (/ n 2)ab
(+ (* p p) (* q q))
(+ (* 2 p q) (* q q))))
(else (fib-iter (- n 1)
(+ (* a p) (* b q))
(+ (* a q) (* b q) (* b p))
pq))))
(define (fib n)
(fib-iter n 0 1 0 1))
PinBlock計算過程
引數 密碼,賬號,leftpinkey,rightpinkey out data 該引數為了帶出計算出來的pinblock 1先將密碼轉換為bcd碼 注意,轉碼後長度會變化,eg ascii碼的6位密碼轉成bcd碼後會縮短 放入pinblock定義好的16個長度的空字元陣列中 2再將賬號轉換為bcd...
詳解ROC AUC計算過程
roc全稱是 受試者工作特徵 receiver operating characteristic roc曲線的面積就是auc area under the curve auc用於衡量 二分類問題 機器學習演算法效能 泛化能力 python中sklearn直接提供了用於計算roc的函式 1 下面就把函...
auto的計算過程
想必大家都遇到過這樣乙個問題,就是想要讓乙個元素在另外乙個元素中實現水平垂直居中 方法有很多,我之前總結了很多種,有興趣的水平方向上我們可以讓margin的值為auto實現水平居中,但是垂直方向上卻不能設定margin的值為auto讓其在垂直方向上居中,你有沒有問過為什麼呢?想知道為什麼嗎?叮叮叮,...