【发布时间】:2019-11-14 14:59:36
【问题描述】:
我正在尝试编写代码,该代码将获取一个列表并给我一个列表,其中大于或等于 10 的元素之后的元素被替换为我选择的数字。在这种情况下,它是列表 +1 ([10,(0+1),0,0...]. 这意味着,在样本二上运行函数后,输出将是 [10,1,0,0,10,0,0,0,0,0,0,0,0]
但是,我需要编写一个函数 zstoints1,它将在整个列表中运行 replace1 函数,并且在语法上有点纠结,而不是返回 [10,1,0,0,10,1 ,0,0,0,0,0,0,0] 它返回 [10,0,0,0,10,0,0,0,0,0,0,0,0]。
sample :: [Int]
sample= [-20,0,0,10,0,10,-20,-20,0,10,0,0,0,-20]
sample2 :: [Int]
sample2= [10,0,0,0,10,0,0,0,0,0,0,0,0]
replace::[Int]->Int->Int->[Int]
replace [] _ _ = []
replace (x:xs) i n | i == 0 = n:xs
| otherwise = x:replace xs (i-1) n
replace1 :: [Int]->[Int]
replace1 (x:xs) = replace (x:xs) 1 ((x:xs)!!1 + 1)
zstoints1 :: [Int]->[Int]
zstoints1 [] = []
zstoints1 (x:xs) |x<=10 = x: zstoints1 xs
|x>=10 = x: zstoints1 (tail(replace1 (x:xs)))
我在哪里犯了错误,什么是正确的写法?
PS:我以复杂的方式编写了替换函数,因为我打算在我的代码中进一步使用它们。
【问题讨论】:
-
这不是问题,但让我评论你的
replace1。它在[]上崩溃,开始。它还在[x]上崩溃,因为它尝试使用(x:xs)!!1访问第二个元素。它调用replace来替换第二个元素。也许您可以分别处理[]和[x]的情况,然后让replace1 (x0:x1:xs) = x0:x1+1:xs。如果您想增加第二个元素,这对我来说看起来要简单得多。 -
"列表中已有的数字 + 1"。 哪个号码?
sample的结果应该是什么? -
我知道,但是在我开始工作后,我还想用它来增加第 7、8 和第 9 个元素。这样会有点复杂。
-
@chepner 下一个位置的数字
-
所以
[10 0 5]应该产生[10 6 5]?或者您只是增加下一个值以获得[10 1 5]?