球拍功能,用于将2欧元和1欧元兑换10分和20分



谁能给我解释一下球拍中的代码,我把2欧元和1欧元的硬币换成10美分和20美分?

我只能换一次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))

查看更多解释

最新更新