计算整数 Haskell 中的奇数位数

Jon*_*n H 1 int haskell integer function

我正在尝试制作使用 Haskell 计算整数奇数位数的程序。我在检查更长的整数时遇到了问题。我的程序现在是这样的:

oddDigits:: Integer -> Int
x = 0
oddDigits i
   | i `elem` [1,3,5,7,9] = x + 1
   | otherwise = x + 0
Run Code Online (Sandbox Code Playgroud)

例如,如果我的整数是 22334455,我的程序应该返回值 4,因为该整数中有 4 个奇数。如何检查该整数中的所有数字?目前它只检查第一位数字并返回 1 或 0。我对 haskell 还是很陌生。

Wil*_*sem 5

为了解决此类问题,您通常会将其分解为较小的问题。一个典型的管道是:

  1. 将数字拆分为数字列表;
  2. 过滤奇数;和
  3. 计算结果列表的长度。

因此,您可以在这里实现/使用辅助函数。例如,我们可以生成一个数字列表:

digits' :: Integral i => i -> [i]
digits' 0 = []
digits' n = r : digits' q
    where (q, r) = quotRem n 10
Run Code Online (Sandbox Code Playgroud)

这里的数字将以相反的顺序产生,但由于这不会影响数字的数量,所以这不是问题。我将其他助手功能留作练习。

  • 我发现过早优化的问题比列表不融合的问题更多。 (2认同)

ƛƛƛ*_*ƛƛƛ 5

您可以先将整数转换22334455为列表"22334455"。然后找出所有满足要求的元素。

import Data.List(intersect)

oddDigits = length . (`intersect` "13579") . show
Run Code Online (Sandbox Code Playgroud)