如何在 Haskell 中一遍又一遍地增加一个数字?

How do I increase a number over and over again in Haskell?

提问人:svenjaleo 提问时间:10/16/2023 更新时间:10/16/2023 访问量:81

问:

我想为每个新调用增加一个数字,所以应该用 bonbons(x-20)、bonbons(x-30) 等代替 bonbons(x-10)。

module AufgabeBonbons where

bonbons :: Int -> Int
bonbons x | x <= 550 && x >= 10 = 1 + bonbons(x-10)
            |otherwise = 0

我试图创建一个新函数,但我不太确定这是否是处理此问题的正确方法。

Haskell 增量

评论

1赞 willeM_ Van Onsem 10/16/2023
增加什么?问题陈述不是很清楚。
0赞 svenjaleo 10/16/2023
因此,对于每个新调用,当前为 x-10 的值应增加到 x-20、x-30 ...最高 x-100
0赞 willeM_ Van Onsem 10/16/2023
所以你想生成一个列表吗?如果您提供一些示例输入/输出并解释输入如何在输出上映射,可能会有所帮助
0赞 svenjaleo 10/16/2023
好的,所以我有美分x,我想买糖果。糖果每颗售价 10 美分、20 美分等,最高可达 1 欧元。我只能买一种糖果(每美分),我想知道我能买多少糖果。

答:

1赞 willeM_ Van Onsem 10/16/2023 #1

基于以下描述:

好的,所以我有美分x,我想买糖果。糖果每颗售价 10 美分、20 美分等,最高可达 1 欧元。我只能买一种糖果(每美分),我想知道我能买到多少糖果。

您实际上是在寻找方程成立的最大 n

enter image description here

这是一个已知的系列,可以解决为:

enter image description here

或者这个:

enter image description here

事实上,想象一下我们有 30 美分,那么结果是 (√5×√125-5)/10=2。

因此,我们可以将其实现为:

bonbons :: Int -> Int
bonbons x = min 10 (floor ((sqrt (5 * (4*x'+5)) - 5) / 10))
  where x' = fromIntegral x

我想为每个新呼叫增加一个号码,因此应该不是 ,应该是 ,依此类推。bonbons(x-10)bonbons(x-20)bonbons(x-30)

我们可以使用一个变量来指定下一个 bonbon 的数量:

bonbons :: Int -> Int
bonbons = go 10
  where go m n
           | m <= n && m < 100 = 1 + go (m+10) (n-m)
           | otherwise = 0

评论

0赞 amalloy 10/16/2023
公式在深色模式下不能很好地呈现,背景是透明的,文本是黑色的。
1赞 Daniel Wagner 10/16/2023
最终实现中的循环也可以通过组合预制的标准库循环来实现:.bonsbons x = length . takeWhile (<=x) . scanl1 (+) $ [10,20..100]