簡體   English   中英

甚至? 計划中的功能(Racket博士)

[英]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項條款, thenelse沒有的關鍵字。 在這種情況下,您可以使用嵌套的ifcond 以下是cond的示例:

(cond ((= expr 0) 1)
      ((even? exp) #| do even ... |#)
      (else #| do odd |#))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM