【问题标题】:Replacing certain elements in a list替换列表中的某些元素
【发布时间】: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]

标签: list haskell


【解决方案1】:

问题来了:

zstoints1 (x:xs)    |x<=10 = x: zstoints1 xs
                   --^^^^^--

这应该只在x &lt; 10 时触发,因为您想在10 上调用replace1,而不是。

【讨论】:

    【解决方案2】:

    这似乎是使用 scanl1 的绝佳机会,它位于 Data.List 包中,默认情况下在 Prelude 中可用。

    doit :: [Int] -> [Int]
    doit = scanl1 (\p c -> if p >= 10 then 1 else c)
    
    *Main> doit [-20,0,0,10,0,10,-20,-20,0,10,0,0,0,-20]
    [-20,0,0,10,1,10,1,-20,0,10,1,0,0,-20]
    *Main> doit [10,0,0,0,10,0,0,0,0,0,0,0,0]
    [10,1,0,0,10,1,0,0,0,0,0,0,0]
    

    【讨论】:

      猜你喜欢
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 2015-09-16
      • 2019-09-17
      • 1970-01-01
      • 2016-02-23
      相关资源
      最近更新 更多