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%,我使用
    min
    将结果减少到2(如有必要),税收为(15-2*5)%=5%
测试:

> (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%,我使用
    min
    将结果减少到2(如有必要),税收为(15-2*5)%=5%
测试:

> (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
重写为
,前提是