【发布时间】:2018-10-09 17:10:12
【问题描述】:
我想在 Racket 中编写一个函数,它接受一定数量的钱和一个特定账单值的列表,然后返回一个列表,其中包含每种类型的账单数量,以使总金额达到给定。例如(calc 415 (list 100 10 5 2 1)) 应该返回'(4 1 1 0 0)。
我尝试过这种方式,但这不起作用:/ 老实说,我想我还没有完全理解在 Racket 中使用 set! 可以/不能做什么。
(define (calc n xs)
(cond ((null? xs) (list))
((not (pair? xs))
(define y n)
(begin (set! n (- n (* xs (floor (/ n xs)))))
(list (floor (/ y xs))) ))
(else (append (calc n (car xs))
(calc n (cdr xs))))))
【问题讨论】:
-
查看this question 对给定金额进行更改,这是完全相同的问题。 (它不是重复的)。看看my answer there 是否有帮助。
-
您的意思是“set”,还是“
set!”? -
设置! mb 我写错了
-
@WillNess 对不起,我还是不明白:/ 我觉得我的问题是我不能在坚持的同时减少我的 n,我曾经减少了多少账单。我的意思是也许我完全错过了这一点,这与他的实际解决方案相去甚远......
-
如果您需要从蛋糕上咬一口,并且仍然握住它,也许您需要两只手,一只手握住每件东西。或变量。也就是两个变量。 :) 或更多,根据需要。你有目标总和,当前总和,剩余总和,可用账单列表......其中一些可能是多余的,但最好写正确,首先,仅优化稍后。俗话说“过早的优化是万恶之母”……也就是说,不要试图立即简洁-您可以随时优化!
标签: recursion scheme racket recursive-backtracking coin-change