2017-03-24 4 views
0

2つの数値を比較するために再帰を使用します(例123は123と同じです)。共通の桁数を格納します(123は123と3、124は2です)。Haskell compare issue

私のプログラムは、私は(彼らは共通の出力値44で2桁の数字を持っている場合、または、彼らは3等他の何かを持っている場合例)どのような状況のための条件を入れたいという番号を見つけませんが、何の比較は行われません一方。誰かが私に何を説明してください、なぜそれが起こるのですか?ここに私のコード:

dg :: Int->Int->Int 
dg 0 0 = 0 
dg x y = if (c==2) then 23 else 24 -- c = common digits 
    where c = digits (x `div` 10) (y `div` 10) + if (x `mod` 10 == y `mod` 10) then 1 else 0   

は私が削除抱擁を実行し、出力は2ですが、私はそれをそれを残し、再実行するとき、それは24になり、入力10 10を与え、条件「IF」(23が正しいながら)。私は本当に混乱しています。 2 Intに共通しているどのように多くの桁数を見つけるために

+0

私は喜んで、その後 '[シャア]に、両方の数字を回し'となりリストを比較して、 '共通L1 L2 =のようななめらか[ e1 | e1 < - l1、elem e1 l2] 'であるが、O(n^2)の性能を有する。リストを比較することは、オーダーではなく共通エレメントのセットのみを気にする場合に特に効果的です。両方のリストを並べ替えることができます。 – 9000

+0

'数字 'とは何ですか?なぜあなたは抱擁を使用していますか? – melpomene

答えて

1

、文字列表現 を使用すると、(これは実際にひどいです、 下の更新を参照してください) あまりにも悪いことではありません。

commonDigits :: Int -> Int -> Int 
commonDigits a b = length . filter id $ zipWith (==) (reverse $ show a) (reverse $ show b) 

reverseは、数字が正しく揃うようにするために必要です。

あなたはポイントフリースタイルに興味があれば:

specialResult :: Int -> Int -> Int 
specialResult a b = 
    case commonDigits a b of 
    2 -> 23 
    3 -> 48 
    _ -> 256 

:あなたはcommonDigitsの結果に応じて、特別なIntを返すようにしたい場合は、別の関数を使用することができます次に

import Data.Function 

commonDigits :: Int -> Int -> Int 
commonDigits = fmap (length . filter id) . zipWith (==) `on` reverse . show 

更新:負の整数の場合、このメソッドは良くありません。引数の1つだけが負の場合、この関数はmod 10バージョンのように動作します。両方が負の場合、 ' - '記号が数字として数えられる可能性があります。

はのは、最も重要な数字に最下位から正と負の両方の数値の桁のリストを与えるdigits機能を使ってみましょう。数字0が入力として与えられた場合、空リストまたは[0]を返しますか?あなたはその電話であなたの電話をしますが、私はあなたがほしいと思うつもりです[0]。我々はcommonDigitsを書き換えることができます。この新しいdigits機能付き

digits :: Int -> [Int] 
digits 0 = [0] 
digits n = digits' (abs n) 
    where 
    digits' 0 = [] 
    digits' n = n `mod` 10 : digits' (n `div` 10) 

commonDigits :: Int -> Int -> Int 
commonDigits = fmap (length . filter id) . zipWith (==) `on` digits