Functional programming 如何创建一个函数,该函数接受N个数字,并生成包含这些元素数字的列表,如示例所示?

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]){

有人知道如何创建一个函数create n),该函数接受n数字,并生成包含这些元素数字的列表。每个列表的元素必须是升序的整数

我不知道如何在Racket中执行,但我的逻辑如下:

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))))]))