[英]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.