Scheme dr racket如何在没有if条件的情况下进行纳税计算
我不熟悉该计划的语言。我想做一个有条件的计税程序。例如:Scheme dr racket如何在没有if条件的情况下进行纳税计算,scheme,racket,Scheme,Racket,我不熟悉该计划的语言。我想做一个有条件的计税程序。例如: Price < 50 ---------------------------------------> Tax = %15 Price > 50 && Prize < 100 ------------------> Tax = %10 Price > 100 --------------------------------------> Tax = %5 价格税
Price < 50 ---------------------------------------> Tax = %15
Price > 50 && Prize < 100 ------------------> Tax = %10
Price > 100 --------------------------------------> Tax = %5
价格<50-------------------------------------------->税=%15
价格>50和奖金<100----------------->税=%10
价格>100------------------->税=%5
在不使用DrRacket&Scheme中的if/switch/condition语句的情况下,是否有任何方法可以进行此计算?假设允许您使用
min
:
(define (tax price)
(/ (* price (- 15 (* 5 (min 2 (quotient price 50)))))
100.0))
- 对于小于50的值,(商价50)为0,因此税为(15-0*5)%=15%李>
- 对于大于等于50且小于100的值,(商价50)为1,因此税为(15-1*5)%10%李>
- 对于大于等于100的值,(商价50)为2或更高。由于我们不低于5%,我使用
将结果减少到2(如有必要),税收为(15-2*5)%=5%min
> (tax 30)
4.5
> (tax 70)
7.0
> (tax 120)
6.0
与使用条件的算法相比:
(for ((n 2000))
(let ((tax1 (tax n))
(tax2 (/ (* n (cond
((< n 50) 15)
((< n 100) 10)
(else 5)))
100.0)))
(unless (= tax1 tax2)
(printf "~a: fun= ~a man= ~a \n" n tax1 tax2 ))))
(用于((n 2000))
出租((税种1(税种n))
(第2类(/(*n)(条件)
(
使用
cond
(至少对于从0到1999的价格值)与公式没有差异。假设允许您使用min
:
(define (tax price)
(/ (* price (- 15 (* 5 (min 2 (quotient price 50)))))
100.0))
- 对于小于50的值,(商价50)为0,因此税为(15-0*5)%=15%李>
- 对于大于等于50且小于100的值,(商价50)为1,因此税为(15-1*5)%10%李>
- 对于大于等于100的值,(商价50)为2或更高。由于我们不低于5%,我使用
将结果减少到2(如有必要),税收为(15-2*5)%=5%min
> (tax 30)
4.5
> (tax 70)
7.0
> (tax 120)
6.0
与使用条件的算法相比:
(for ((n 2000))
(let ((tax1 (tax n))
(tax2 (/ (* n (cond
((< n 50) 15)
((< n 100) 10)
(else 5)))
100.0)))
(unless (= tax1 tax2)
(printf "~a: fun= ~a man= ~a \n" n tax1 tax2 ))))
(用于((n 2000))
出租((税种1(税种n))
(第2类(/(*n)(条件)
(
与使用
cond
(至少对于0到1999年的价格值)的公式没有区别。确实有一种方法可以完全不使用任何条件,即使是使用min
等条件的预定义函数,但如果您是Scheme新手,您不会喜欢它,并且可能不是您想要的。诀窍是回到光秃秃的lambda演算,这个方案就是从中衍生出来的
首先,将true和false的原语重新定义为返回第一个或第二个参数的函数:
(define TRUE (lambda(t f) t))
(define FALSE (lambda(t f) f))
其次,将数字零定义为只包含FALSE
的列表(我们甚至可以避免使用列表原语,但对于一个简单的示例,这就可以了),并定义两个函数来递增和递减一个数字:
(define zero (list FALSE))
(define (inc n) (cons TRUE n))
(define (dec n) (rest n))
定义一些数字:
(define one (inc zero))
(define two (inc one))
(define three (inc two))
因此,任何非零
的(正)数的第一个元素是真
,对于零
,它是假
。您可以使用此信息定义一个函数,该函数以一个数字和两个函数作为参数,如果数字为正数,则应用第一个函数,否则应用第二个函数:
(define (if-positive n proc-true proc-false)
(((first n)
proc-true
proc-false)))
;; TESTS
(if-positive three (lambda() 'positive) (lambda() 'zero)) ; -> 'positive
(if-positive zero (lambda() 'positive) (lambda() 'zero)) ; -> 'zero
现在,我们可以做一个函数,取两个数和两个过程,递归地从每个数中减去1,如果第一个数先达到0,则应用第一个过程,但如果第二个数先达到0,则应用第二个过程:
(define (if-greater n1 n2 proc-true proc-false)
(if-positive
n1
(lambda()(if-positive
n2
(lambda()(if-greater (dec n1) (dec n2) proc-true proc-false))
proc-true))
proc-false))
;; TESTS
(if-greater three two (lambda() 0.15) (lambda() 0.1)) ; -> 0.15
(if-greater one two (lambda() 0.1) (lambda() 0.05)) ; -> 0.05
现在你需要做的就是定义数字100和50,你就可以开始了。当然,这是非常不切实际的,但这就是不使用if
所得到的结果。(请注意,如果使用基数2而不是基数1,可能会使其更加实用,但对于本例,这是一个细节。)
例如,更多信息,但对新手来说可能有点苛刻。确实有一种方法可以完全不使用任何条件,即使是使用诸如
min
等条件的预定义函数,但如果您是Scheme新手,您将不会喜欢它,并且可能不是您所追求的。诀窍是回到光秃秃的lambda演算,这个方案就是从中衍生出来的
首先,将true和false的原语重新定义为返回第一个或第二个参数的函数:
(define TRUE (lambda(t f) t))
(define FALSE (lambda(t f) f))
其次,将数字零定义为只包含FALSE
的列表(我们甚至可以避免使用列表原语,但对于一个简单的示例,这就可以了),并定义两个函数来递增和递减一个数字:
(define zero (list FALSE))
(define (inc n) (cons TRUE n))
(define (dec n) (rest n))
定义一些数字:
(define one (inc zero))
(define two (inc one))
(define three (inc two))
因此,任何非零
的(正)数的第一个元素是真
,对于零
,它是假
。您可以使用此信息定义一个函数,该函数以一个数字和两个函数作为参数,如果数字为正数,则应用第一个函数,否则应用第二个函数:
(define (if-positive n proc-true proc-false)
(((first n)
proc-true
proc-false)))
;; TESTS
(if-positive three (lambda() 'positive) (lambda() 'zero)) ; -> 'positive
(if-positive zero (lambda() 'positive) (lambda() 'zero)) ; -> 'zero
现在,我们可以做一个函数,取两个数和两个过程,递归地从每个数中减去1,如果第一个数先达到0,则应用第一个过程,但如果第二个数先达到0,则应用第二个过程:
(define (if-greater n1 n2 proc-true proc-false)
(if-positive
n1
(lambda()(if-positive
n2
(lambda()(if-greater (dec n1) (dec n2) proc-true proc-false))
proc-true))
proc-false))
;; TESTS
(if-greater three two (lambda() 0.15) (lambda() 0.1)) ; -> 0.15
(if-greater one two (lambda() 0.1) (lambda() 0.05)) ; -> 0.05
现在你需要做的就是定义数字100和50,你就可以开始了。当然,这是非常不切实际的,但这就是不使用if
所得到的结果。(请注意,如果使用基数2而不是基数1,可能会使其更加实用,但对于本例,这是一个细节。)
例如,更多信息,但对新来者来说可能有点苛刻。不愿意回答,因为这是家庭作业,但是 首先,下面是我如何使用
cond
:
#lang racket
(require rackunit)
(define (tax-rate price)
(cond [(< price 50) 0.15]
[(< price 100) 0.10]
[else 0.05]))
(check-equal? (tax-rate 1) 0.15)
(check-equal? (tax-rate 50) 0.10)
(check-equal? (tax-rate 100) 0.05)
(define (tax-rate2 price)
(or (and (< price 50) 0.15)
(and (< price 100) 0.10)
0.05))
(check-equal? (tax-rate2 1) 0.15)
(check-equal? (tax-rate2 50) 0.10)
(check-equal? (tax-rate2 100) 0.05)
一般来说,可以将cond
重写为或
,前提是