【问题标题】:haskell backtracking with integer带整数的haskell回溯
【发布时间】:2017-06-19 22:57:45
【问题描述】:

我是 Haskell 新手。所以,我想问一个简单的问题。

我必须在回溯的帮助下找到包含具有以下特征的 9 个数字的(唯一)数字:

数字 1/9 只出现一次。

n 的前 k 个数是 从 1/9 开始运行的 k 可以被 k 整除

示例

n = 123456789 1 (the first number of n) should be divisible by 1. true! 2 (the first 2 numbers of n) should be divisible by 2. true! 3 (the first 3 numbers of n) should be divisible by 3. true! 4 (the first 4 numbers of n) should be divisible by 4. false!

所以,123456789 不是想要的数字

【问题讨论】:

  • 虽然我不知道haskell。但是This Link 可能对您有所帮助,因为它可以回答相同的问题。有多个答案,两个答案都会对您有所帮助,因为一个是从算法的角度来看,另一个是从编程的角度来看..
  • 非常有帮助的网站!但不是同一种编程语言。
  • 是的,我知道 C 但不知道 haskel。因此,通过解释 C 代码,您必须将其转换为 haskel。对不起。
  • (我更喜欢区分 numberdigit,并提及 decimal。)

标签: algorithm haskell functional-programming backtracking


【解决方案1】:

解决办法如下:

module Main where

import Data.Maybe
import Data.Set (Set)
import qualified Data.Set as Set

findUniqueNumber :: Int -> Int -> Set Int -> Maybe Int
findUniqueNumber currNum divisor remDigits
  | divisor == 9 && currNum `rem` divisor == 0 = Just currNum
  | divisor > 0 && currNum `rem` divisor /= 0  = Nothing
  | otherwise                                  =
    case filter isJust posNums of
       []             -> Nothing
       [uniqueNumber] -> uniqueNumber
    where
        posNums   = map posAns (Set.toList remDigits)
        posAns d' = findUniqueNumber (currNum * 10 + d') (divisor + 1) (Set.delete d' remDigits)

main :: IO ()
main = (print . fromJust) $ findUniqueNumber 0 0 (Set.fromList [1..9])

【讨论】:

    【解决方案2】:
    uniekGetal :: [Int]
    uniekGetal = [val9 | 
            x1 <- [1..9],
            let val = x1,
            x2 <- [x| x <- [1..9], x /= x1],
            let val2 = val * 10 + x2,
            mod val2 2 == 0,
            x3 <- [x| x <- [1..9], x /= x1, x /= x2],
            let val3 = val2 * 10 + x3,
            mod val3 3 == 0,
            x4 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3],
            let val4 = val3 * 10 + x4,
            mod val4 4 == 0,
            x5 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4],
            let val5 = val4 * 10 + x5,
            mod val5 5 == 0,
            x6 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4, x /= x5],
            let val6 = val5 * 10 + x6,
            mod val6 6 == 0,
            x7 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4, x /= x5, x /= x6],
            let val7 = val6 * 10 + x7,
            mod val7 7 == 0,
            x8 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4, x /= x5, x /= x6, x /= x7],
            let val8 = val7 * 10 + x8,
            mod val8 8 == 0,
            x9 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4, x /= x5, x /= x6, x /= x7, x /= x8],
            let val9 = val8 * 10 + x9,
            mod val9 9 == 0]
    

    这是我的问题的解决方案。

    【讨论】:

      猜你喜欢
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多