如何在球拍列表中进行分配

时间:2018-12-13 11:15:21

标签: scheme lisp racket

例如,我有一个6位数字的列表(1 2 3 4 5 6)。选择数字时,它将其值(+1)分配给其后的数字:

'(1 2 3 4 5 6) 我选择的第四个数字是4。

程序然后:

4-1 & 5+1
3-1 & 6+1
2-1 & 1+1
1-1 & 2+1

因为他在6岁时就完成了任务,因此请返回列表的开头继续进行分配。 当起始值达到0时停止

我已经具有选择号码的功能,但是我不知道这样的分配方式。

希望很清楚,

非常感谢您

1 个答案:

答案 0 :(得分:0)

有很多方法可以完成您想做的事情!一种方法是使用“循环列表”。在列表中,每个元素还具有指向下一个元素的指针。在循环列表中,最后一个元素指向第一个元素,这样您就可以在遍历列表时不断回绕!

编写我们自己的循环列表实现不是很困难,但是幸运的是,可以通过srfi/1库访问循环列表。使用该库的一种可能的实现如下所示:

#lang racket

(require srfi/1) 

; function we will apply distributively to values in list
(define (1+ val) (+ val 1))

(define (distribute function l n)
  ; we define an inner function so we can take list l
  ; and convert it to a "circular" list

  (define (inner-distribute func circular-l n count)
    (if (> count 0)
        (cons (func (list-ref circular-l n))
              (inner-distribute func circular-l (+ n 1) (- count 1)))
        '()))
  (inner-distribute function (apply circular-list l) n n))

(distribute 1+ '(1 2 3 4 5 6) 4)
; this returns the list '(6 7 2 3)
; just like you specified in your question!

distribute函数可以完成任务,但是就像我说的那样,有很多方法可以完成此任务。我强烈建议您学习上面的代码并理解它-只需少量的努力,您应该能够发现一些远远优于上面的解决方案的解决方案。祝你好运!

edit:在评论中,OP感觉上面的代码对他们来说太难理解了。这是另一种方法:

(require srfi/1) 

; function we will apply distributively to values in list
(define (1+ val) (+ val 1))

(define (distribute func l n)
    (map (lambda (x)
           (func (list-ref (apply circular-list l) x)))
         (range n (+ n n))))

(distribute 1+ '(1 2 3 4 5 6) 4) ; works!

此解决方案背后的想法是,我们创建一个从n到n * 2的数字列表,然后将这些数字中的每一个索引到循环列表中的元素并对其应用函数(在这种情况下, 1+)。