10分20分换2欧元和1欧元的球拍功能

Racket Function for Changing 2 and 1 Euro with 10 Cents and 20 Cents

谁能给我解释一下 Racket 中的代码,我可以在其中用 10 美分和 20 美分兑换 2 欧元和 1 欧元硬币?

我只能兑换一次 2 欧元硬币和一次 1 欧元硬币。有 20 美分和 10 美分。这是我的代码:

(define (change sum coins) 
  (if (< sum 200) 
    0 
    (if (= sum 200) 
      1 
      (if (and (> sum 0) 
               (<= (length coins) 0)) 
        0 
        (+ (change (- sum (car coins)) (cdr coins)) 
           (change sum (cdr coins))))))) 

(change 200'(20 10)) 
(change 100'(20 10)) 

那我要修改什么?感谢您的帮助!

由于 200 目标是硬编码的,您应该从当前总和 0 开始,向上计数,而不是向下计数:

(define (change sum coins) 
  (if (> sum 200)             ; invalid solution
    0 
    (if (= sum 200)              ; good solution
      1 
      (if (= (length coins) 0)     ; no more coins to use
        0 
        (+ (change (+ sum (car coins))  ; use first coin,
                   coins)               ; _increasing_ the sum
           (change sum 
                   (cdr coins)))))))      ; don't use first coin any more

现在我们有

> (change 0 '(10))
1
> (change 0 '(20 10))
11
> (change 0 '(7))
0
> 

现在您可以抽象出目标值 200,使其成为新函数中的参数,新函数必须将此函数作为其内部定义,以便它可以访问其参数:

(define (coin-change-ways target coins)
  (define (change sum coins) 
     ....
     ....)
  (change 0 coins))

有关更多说明,请参阅