Я пытаюсь создать функцию под названием lcm-from-factors, которая вычисляет наименьшее общее кратное двух чисел (m и n). Входными данными для функции являются m-co-groups и n-co-groups, в которых перечислены все простые Факторы и их силы. Например, для m = 2970 и n = 163 800 мы будем иметь:
m-когрупп = '((2 1) (3 3) (5 1) (7 0) (11 1) (13 0)) n-когрупп = '((2 3) (3 2) ( 5 2) (7 1) (11 0) (13 1))
Они возвращаются функцией, называемой кофактором, которая была дана мне. Я написал код, но функция не компилируется, потому что я считаю, что неправильно реализовал рекурсию. Я был бы признателен за любую помощь в выяснении того, что я делаю неправильно. Мой код выглядит следующим образом.
(define (lcm-from-factors m n)
(let-values (((m-co-groups n-co-groups) (co-factor m n)))
(define (recurse m-co-groups n-co-groups)
(let* ((a (first(m-co-groups)))
(b (first(n-co-groups))))
(cond ((>= (rest(a)) (rest(b)))
(+ (expt (first(a)) (rest(a))) (recurse (rest(m-co-groups)) (rest(n-co-groups)))))
(else (+ (expt (first(b)) (rest(b))) (recurse (rest(m-co-groups)) (rest(n-co-groups))))))))))
(co-factor m n)
нужно оценивать два списка процедур, поскольку вы применяете элементы ((a)
и(b)
), и эти процедуры должны создавать пары, поскольку вы пытаетесьfirst
получить результаты? - person Sylwester   schedule 10.02.2015(m-co-groups)
означает вызовm-co-groups
как процедуры. Если это не процедура, вы получите сообщение об ошибке. Ни одна из переменных никогда не должна вызываться как процедура. - person Sylwester   schedule 10.02.2015a
было(lambda () 10)
, то(a)
становится 10. Еслиa
равно(2 1)
, вы получаете сообщение об ошибке, говорящее, что(2 1)
не является процедурой, так как вы фактически вызываете('(2 1))
Я предполагаю, что вы теряете много ошибок, удаляя лишние скобки. например,(first m-co-groups)
вместо(first (m-co-groups))
, что может потребовать, чтобыm-co-groups
была процедурой, подобной+
. - person Sylwester   schedule 10.02.2015(recurse m-co-groups n-co-groups)
в качестве последнего выражения вlet-values
. Вы можете сделать и то, и другое в одной форме с именованным let(let recurse ((m-co-groups m-co-groups) (n-co-groups n-co-groups) ... )
- person Sylwester   schedule 10.02.2015