Functional programming 如何创建一个函数,该函数接受N个数字,并生成包含这些元素数字的列表,如示例所示?
有人知道如何创建一个函数create n),该函数接受n数字,并生成包含这些元素数字的列表。每个列表的元素必须是升序的整数我不知道如何在Racket中执行,但我的逻辑如下:Functional programming 如何创建一个函数,该函数接受N个数字,并生成包含这些元素数字的列表,如示例所示?,functional-programming,Functional Programming,有人知道如何创建一个函数create n),该函数接受n数字,并生成包含这些元素数字的列表。每个列表的元素必须是升序的整数我不知道如何在Racket中执行,但我的逻辑如下: ListOfLists = new List() indexEntry = 0 j = 1 listTemp = new List() while (indexInput <ListOfLists.size()){ while(TempList.size() < Entry[Input index]){
ListOfLists = new List()
indexEntry = 0
j = 1
listTemp = new List()
while (indexInput <ListOfLists.size()){
while(TempList.size() < Entry[Input index]){
listTemp.Add(j)
j = j+1
}
ListOfLists.Add(TempList)
listTemp = new List()
indexInput = indexInput +1
}
ListOfLists=新列表()
indexEntry=0
j=1
listTemp=新列表()
而(indexInput您可能需要以功能性的方式编写,尤其是没有副作用。这是可能的,并且不会透露太多,我建议编写3个功能:
范围列表
包含两个参数from
和to
,它构建了一个包含两个边界的数字列表;例如(范围列表2 4)
是(2 3 4)
生成列表
它接受一个开始
参数(从中生成整数的下一个整数)和一个大小
参数(一个列表),一个大小列表。它调用范围列表
来构建列表,并递归到自身来构建下一个列表列表
answer
函数(您可以对其重命名),它接受可变数量的参数,并以1开头和给定的大小列表调用makelists
我在Common Lisp中实现了这一点,并用您的示例跟踪了所有这些函数,输出如下(注意,不要介意SO:
前缀,它是当前包(名称空间),它代表StackOverflow):
这应该可以帮助你开始
在这种实现中,这些是非终端递归函数。但是请注意,范围列表
如何从结束
推送项目。此外,如果您以终端递归方式预处理大小
列表(如折叠/缩小),您可以确定哪一个是最后一个整数,并以终端递归方式从最后一个到第一个构建列表。这里有一个简单的解决方案
首先,我构建一个序列,然后根据参数进行分区:
#lang racket
(define (create-lln f . r)
; collects all args into a list
(define l (cons f r))
; builds sequence from [1, (sum l)]
(define seq (build-list (apply + l) add1))
; partitioning
(take-multiple l seq))
; partitions `taken-list` by `taking-list`
; example:
; (take-multiple '(3 4 4) '(1 2 3 4 5 6 7 8 9 10 11))
; => '((1 2 3) (4 5 6 7) (8 9 10 11))
(define (take-multiple taking-list taken-list)
(cond [(empty? taking-list) empty]
[else (begin
(define f (first taking-list))
(cons
(take taken-list f)
(take-multiple (rest taking-list) (list-tail taken-list f))))]))
你尝试了什么?@Renzo以下是我如何尝试和思考的,我编辑了帖子为什么你要从帖子中删除所有信息?现在很难理解。请使用问题上的编辑链接添加其他信息。帖子回答按钮只能用于问题的完整答案-
#lang racket
(define (create-lln f . r)
; collects all args into a list
(define l (cons f r))
; builds sequence from [1, (sum l)]
(define seq (build-list (apply + l) add1))
; partitioning
(take-multiple l seq))
; partitions `taken-list` by `taking-list`
; example:
; (take-multiple '(3 4 4) '(1 2 3 4 5 6 7 8 9 10 11))
; => '((1 2 3) (4 5 6 7) (8 9 10 11))
(define (take-multiple taking-list taken-list)
(cond [(empty? taking-list) empty]
[else (begin
(define f (first taking-list))
(cons
(take taken-list f)
(take-multiple (rest taking-list) (list-tail taken-list f))))]))