Scheme 游戏“Oware”的项目

Scheme 游戏“Oware”的项目,scheme,racket,Scheme,Racket,我有一个关于游戏Oware的项目,我们应该在Dr.Racket程序中编写游戏。 这些是游戏规则,它们解释得很好,用图片说明: 我在第一个练习中有点卡住了,我有这个方法,但是它没有按照正确的顺序给出数字 我们必须编写的第一个函数叫做distribute,它应该在孔中重新放置x个晶粒,以列表的形式给出结果,该列表由剩余晶粒的数量和孔的新数量组成 这是人们所期望的: (distribute 5 '(2 3 1 5 5 2)) -> (0 (3 4 2 6 6 2)) (distribute 5

我有一个关于游戏Oware的项目,我们应该在Dr.Racket程序中编写游戏。 这些是游戏规则,它们解释得很好,用图片说明: 我在第一个练习中有点卡住了,我有这个方法,但是它没有按照正确的顺序给出数字

我们必须编写的第一个函数叫做distribute,它应该在孔中重新放置x个晶粒,以列表的形式给出结果,该列表由剩余晶粒的数量和孔的新数量组成

这是人们所期望的:

(distribute 5 '(2 3 1 5 5 2)) -> (0 (3 4 2 6 6 2))
(distribute 5 '(2 3 1))       -> (2 (3 4 2))
我写的是:

(define distribue
  (lambda (n l)
    (if (or (= n 0) (null? l))
        (list l n)
        (cons (+ (car l) 1) (distribue (- n 1) (cdr l))))))
它提供了:

(distribue 5 '(2 3 1 5 5 2))  -> (3 4 2 6 6 (2) 0)
(distribue 5 '(2 3 1))        -> (3 4 2 () 2)
我试图更改列表,但从未得到预期的答案形式

怎么样

(define (distribue n l)
  (define (iterator n p q)
    (if (or (= n 0) (null? q))
        (list n (append p q))
        (iterator (- n 1) (append p (list (+ 1 (car q)))) (cdr q))))
  (iterator n '() l))
在哪里

返回

'(0 (3 4 2 6 6 2))
'(2 (3 4 2))

根据需要。

谢谢您的帮助,尽管我有一些问题。我们从未在这种情况下编写过代码,我们先编写define,然后编写lambda。这两者之间的区别是什么?您编写的代码中的迭代器是什么?那p呢?如果我没弄错的话,n和我一样,q是列表define fxy x y+xy或多或少和define fxy lambda x y+xy y相同p是列表的第一部分,我们在每个杯子中添加了一个豆子,q是列表的第二部分,豆子可能还需要添加。啊,好的,我想我现在知道了。为什么我认为迭代器是另一个预定义的代码,只是意识到情况并非如此。多谢各位:
'(0 (3 4 2 6 6 2))
'(2 (3 4 2))