[英]Even? function in Scheme (Dr. Racket)
我正在嘗試在Scheme中編寫一個程序,以使用快速冪算法/遞歸來計算冪函數的結果。 該算法應該是正確的,但是我的語法不正確。 該程序可以編譯,但是當我輸入一個基數和exp進行測試時,Racket博士凍結並耗盡了內存。 很難找到在線示例,以了解(even?)函數應如何出現在方案代碼中。 我認為這可能會拖累我的語法。 計划的新手,所以將不勝感激。
(define (powFun base exp)
(if ( = exp 0) //base case
1
(even? exp //if exp is even
(*
(powFun base ( / exp 2))
(powFun base ( / exp 2))
)
(*
(powFun base (- exp 1) ) // else if exp is odd
base
)
)
)
)
您似乎正在使用even?
好像是某種類似於if
的宏。 但是, even?
是一個帶一個參數的常規函數,因此您應該編寫(even? exp)
而不是(even? exp evaluate-if-even evaluate-if-not-even)
。 那意味着even?
的返回值even?
需要自己的if
表達式:
(if base-case
1
(if (even? exp)
evaluate-if-even
evaluate-if-not-even))
...這意味着您應該改用cond
。
或者,您可以定義一個宏以您認為的方式工作even?
工作了。 讓我們稱之為if-even
:
(define-syntax if-even
(syntax-rules ()
((_ n evaluate-if-even evaluate-if-not-even)
(if (even? n) evaluate-if-even evaluate-if-not-even))))
然后替換even?
在您的原始程序中使用if-even
。 更正您使用even?
然后切換到cond
而不是if
是更好的選擇。
even?
與if
-您可以使用它來測試一個數字是否為偶數。
它沒有“分支”:
> (even? 2)
#t
> (even? 2 "even" "odd")
. . ..\..\Program Files (x86)\Racket\share\pkgs\drracket\drracket\private\rep.rkt:1088:24: even?: arity mismatch;
the expected number of arguments does not match the given number
expected: 1
given: 3
arguments...:
2
"even"
"odd"
您可以將其用作條件中的測試:
> (if (even? 2) "even" "odd")
"even"
如果要測試多個條件,可以使用cond
代替if
:
> (define x 3)
> (cond ((= x 1) "one")
((even? x) "even")
(else "odd"))
"odd"
但這不是DrRacket“凍結”的原因。
這樣做的原因是該除法不是整數除法,但實際上會產生精確的分數結果:
> (/ 1 2)
1/2
> (/ (/ 1 2) 2)
1/4
> (/ (/ (/ 1 2) 2) 2)
1/8
因此,您將永遠無法達成最終目標。
您應該使用quotient
過程:
> (quotient 3 2)
1
> (quotient 2 2)
1
> (quotient 1 2)
0
利用sqr
過程並將方括號從“ C樣式”更改為“方案樣式”,它可能看起來像這樣:
(define (powFun base exp)
(if (= exp 0)
1
(if (even? exp)
(sqr (powFun base (quotient exp 2)))
(* (powFun base (- exp 1)) base))))
要么
(define (powFun base exp)
(cond ((= exp 0) 1)
((even? exp) (sqr (powFun base (quotient exp 2))))
(else (* (powFun base (- exp 1)) base))))
> (powFun 2 3)
8
> (powFun 2 0)
1
> (powFun 2 300)
2037035976334486086268445688409378161051468393665936250636140449354381299763336706183397376
注意事項:交互窗口對於查找問題時的少量代碼測試非常有用。
if
只能拿最多2項條款, then
和else
沒有的關鍵字。 在這種情況下,您可以使用嵌套的if
或cond
。 以下是cond
的示例:
(cond ((= expr 0) 1)
((even? exp) #| do even ... |#)
(else #| do odd |#))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.