如何 return 列表列表中的字符串列表?
How do I return a list of strings from a list of lists?
作业题如下...
(10 分) 编写一个函数 explode 给定元组列表 (n x),通过插入创建一个新列表
x 代替 (n x) 进入列表 n 次(换句话说,插入的项目应该在相同的位置
创建新列表时作为原始元组排序)。您可以假设 n 将始终位于
至少 0.
(explode ‘((2 "Hello"))) produces ->("Hello" "Hello")
(explode ‘((2 "Hello") (3 "world"))) produces ->("Hello" "Hello"
"world" "world" "world")
到目前为止我想到的一个可能的解决方案是有一个循环来跟踪算法当前正在处理的元组,然后在该循环内部有一个函数定义,该函数定义将被递归调用以添加字符串到 return 列表。但我不确定这是否有效,因为它似乎需要使用 'set!' 教授说我们不允许使用。
我不是在寻找完整的答案,因为这是一道作业题。我只想指出正确的方向来解决这个问题,也许使用一些 sudo 代码。
谢谢大家!
- 空列表的
explode
会产生什么?
'((2 "Hello") (3 "world")))
的explode
生产什么?
'((3 "world"))
的explode
生产什么?
- 如何从#3 转到#2?
如何 "combine" #3(对 cdr 的递归调用)的结果与 '(2 "Hello")
(列表的汽车)产生 #2 的结果?
你可以假设你在构造"combine"函数时得到了递归调用的结果(combine函数也可能是递归的)
把这个分成两个问题:
首先,编写一个函数expand
,其工作方式如下:
(expand 3 "world") => ("world" "world" "world"))
其次,实现 explode
以便它对其每个参数调用 expand
,并将结果一起附加到一个列表中。
(explode '(x y z ...)) =>
(append (expand (first x) (second x))
(expand (first y) (second y))
(expand (first z) (second z))
...)
两个函数都可以递归。 expand
的基本情况是列表的第一个元素是 0
。 explode
的基本情况是列表为空时。您需要弄清楚如何将当前结果与递归调用相结合,以便为每个问题产生正确的结果。
在使用函数式语言时尽量不要考虑循环。
一般来说,大多数用循环命令式解决的问题,可以用 map and reduce (foldr/foldr in Racket) 函数解决。特殊情况下,这些功能还不够用的时候,可以考虑递归。
您的特定任务只需使用 map
函数即可解决:
#lang racket
(define(explode tuples)
(flatten
(map
(lambda (tuple)
(let*
([repeat-n-times (range (first tuple))]
[value (second tuple)])
(map (λ _ value) repeat-n-times)))
tuples)))
作业题如下...
(10 分) 编写一个函数 explode 给定元组列表 (n x),通过插入创建一个新列表 x 代替 (n x) 进入列表 n 次(换句话说,插入的项目应该在相同的位置 创建新列表时作为原始元组排序)。您可以假设 n 将始终位于 至少 0.
(explode ‘((2 "Hello"))) produces ->("Hello" "Hello")
(explode ‘((2 "Hello") (3 "world"))) produces ->("Hello" "Hello" "world" "world" "world")
到目前为止我想到的一个可能的解决方案是有一个循环来跟踪算法当前正在处理的元组,然后在该循环内部有一个函数定义,该函数定义将被递归调用以添加字符串到 return 列表。但我不确定这是否有效,因为它似乎需要使用 'set!' 教授说我们不允许使用。
我不是在寻找完整的答案,因为这是一道作业题。我只想指出正确的方向来解决这个问题,也许使用一些 sudo 代码。
谢谢大家!
- 空列表的
explode
会产生什么? '((2 "Hello") (3 "world")))
的explode
生产什么?'((3 "world"))
的explode
生产什么?- 如何从#3 转到#2?
如何 "combine" #3(对 cdr 的递归调用)的结果与 '(2 "Hello")
(列表的汽车)产生 #2 的结果?
你可以假设你在构造"combine"函数时得到了递归调用的结果(combine函数也可能是递归的)
把这个分成两个问题:
首先,编写一个函数expand
,其工作方式如下:
(expand 3 "world") => ("world" "world" "world"))
其次,实现 explode
以便它对其每个参数调用 expand
,并将结果一起附加到一个列表中。
(explode '(x y z ...)) =>
(append (expand (first x) (second x))
(expand (first y) (second y))
(expand (first z) (second z))
...)
两个函数都可以递归。 expand
的基本情况是列表的第一个元素是 0
。 explode
的基本情况是列表为空时。您需要弄清楚如何将当前结果与递归调用相结合,以便为每个问题产生正确的结果。
在使用函数式语言时尽量不要考虑循环。
一般来说,大多数用循环命令式解决的问题,可以用 map and reduce (foldr/foldr in Racket) 函数解决。特殊情况下,这些功能还不够用的时候,可以考虑递归。
您的特定任务只需使用 map
函数即可解决:
#lang racket
(define(explode tuples)
(flatten
(map
(lambda (tuple)
(let*
([repeat-n-times (range (first tuple))]
[value (second tuple)])
(map (λ _ value) repeat-n-times)))
tuples)))