遞迴計算過程和迭代計算過程

2021-09-06 11:32:34 字數 3143 閱讀 9405

這次主要想通過幾個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讓其在垂直方向上居中,你有沒有問過為什麼呢?想知道為什麼嗎?叮叮叮,...