LINUX.ORG.RU

История изменений

Исправление HolyBoy, (текущая версия) :

-- recursion version
--
fermaPyr 0 = 0
fermaPyr n = fermaTria n + fermaPyr (n - 1)

-- tail recursion version
-- 
fermaPyr' n = let fAcc 0 a = a
                  fAcc n a = fAcc (n - 1) (fermaTria' n + a)
              in fAcc n 0
    
-- tail recursion ver.2
--
fermaPyr'' 0 = 0
fermaPyr'' n = fermaTria' n + fermaPyr'' (n - 1)


-- recursion version
-- 
fermaTria 0 = 0
fermaTria n = n + fermaTria (n - 1)

-- tail recursion version
fermaTria' n = let fAcc 0 a = a
                   fAcc n a = fAcc (n - 1) (n + a)
               in fAcc n 0

main = do
    let a = fermaPyr 10000
        b = fermaPyr' 10000
        c = fermaPyr'' 10000
    putStrLn $ show a
    --putStrLn $ show b
    --putStrLn $ show c

Вот так лучше?

Смысл этого упражнения был в том, чтобы понять, как работает хвостовая рекурсия.

Исправление HolyBoy, :

-- recursion version
--
fermaPyr 0 = 0
fermaPyr n = fermaTria n + fermaPyr (n - 1)

-- tail recursion version
-- 
fermaPyr' n = let fAcc 0 a = a
                  fAcc n a = fAcc (n - 1) (fermaTria' n + a)
              in fAcc n 0
    
-- tail recursion ver.2
--
fermaPyr'' 0 = 0
fermaPyr'' n = fermaTria' n + fermaPyr'' (n - 1)


-- recursion version
-- 
fermaTria 0 = 0
fermaTria n = n + fermaTria (n - 1)

-- tail recursion version
fermaTria' n = let fAcc 0 a = a
                   fAcc n a = fAcc (n - 1) (n + a)
               in fAcc n 0

main = do
    let a = fermaPyr 10000
        b = fermaPyr' 10000
        c = fermaPyr'' 10000
    putStrLn $ show a
    --putStrLn $ show b
    --putStrLn $ show c

Вот так лучше?

Смысл этого упраженения был в том, чтобы понять, как работает хвостовая рекурсия.

Исходная версия HolyBoy, :

-- recursion version
--
fermaPyr 0 = 0
fermaPyr n = fermaTria n + fermaPyr (n - 1)

-- tail recursion version
-- 
fermaPyr' n = let fAcc 0 a = a
                  fAcc n a = fAcc (n - 1) (fermaTria' n + a)
                in fAcc n 0
    
-- tail recursion ver.2
--
fermaPyr'' 0 = 0
fermaPyr'' n = fermaTria' n + fermaPyr'' (n - 1)


-- recursion version
-- 
fermaTria 0 = 0
fermaTria n = n + fermaTria (n - 1)

-- tail recursion version
fermaTria' n = let fAcc 0 a = a
                   fAcc n a = fAcc (n - 1) (n + a)
               in fAcc n 0

main = do
    let a = fermaPyr 10000
        b = fermaPyr' 10000
        c = fermaPyr'' 10000
    putStrLn $ show a
    --putStrLn $ show b
    --putStrLn $ show c

Вот так лучше?

Смысл этого упраженения был в том, чтобы понять, как работает хвостовая рекурсия.