Игорь Пашев - НОД на Луне

Feb. 20th, 2011

03:57 pm - НОД на Луне

Previous Entry Add to Memories Tell A Friend Next Entry

#!/usr/bin/env lua

-- SYNOPSIS:
-- # chmod +x gcd.lua; ./gcd.lua 121 22 33 44
-- # lua gcd.lua 121 33 22

-- http://www.lua.org/pil/6.3.html
function gcd2(a, b)
    if b == 0 then
        return a
    else
        return gcd2(b, a % b)
    end
end

function gcdn(ns)
    r = ns[1]
    local r = ns[1]
    for i = 2, table.maxn(ns) #ns do
        r = gcd2(r, ns[i])
    end
    return r
end

print(gcdn(arg))

Tags: , ,
(6 комментариев | Оставить комментарий)

Comments:

[User Picture]
From:[info]ketmar
Date:February 21st, 2011 - 08:39 am
(Link)
однако, устаревший синтаксис. и баги.

function gcdn(ns)
    local r = ns[1]
    for i = 2, #ns do
        r = gcd2(r, ns[i])
    end
    return r
end
(Reply to this) (Thread)
[User Picture]
From:[info]igorpashev
Date:February 21st, 2011 - 08:52 am
(Link)
fixed.

https://github.com/ip1981/GCD/blob/master/gcd.lua
(Reply to this) (Parent) (Thread)
[User Picture]
From:[info]ketmar
Date:February 21st, 2011 - 08:59 am
(Link)
и в посте почини, что ли. всё-таки пост обычно больше смотрят, нежели гит.
(Reply to this) (Parent)
[User Picture]
From:[info]ketmar
Date:February 21st, 2011 - 08:40 am
(Link)
ну, и можно упомянуть, что взрыва стека не будет, потому что proper tail call.
(Reply to this) (Thread)
[User Picture]
From:[info]igorpashev
Date:February 21st, 2011 - 08:53 am
(Link)
GCC, кстати, тоже умеет.
(Reply to this) (Parent) (Thread)
[User Picture]
From:[info]ketmar
Date:February 21st, 2011 - 08:58 am
(Link)
только если какой-нибудь O включить поболее нуля. а так да — я этим троллил любителей скалы, у которых «функциональное программирование возможно, все дела», а стек взрывается от двух взаимно рекурсивных функций. и рядом выхлоп objdump от gcc, где явно видно, что как раз ни разу не функциональный gcc вполне себе асиливает понять и сделать TCO.
(Reply to this) (Parent)