You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scheme/DRracket多参数GCD与LCM可变参数通用函数实现咨询

Scheme 任意参数GCD与LCM函数实现

我们基于你提供的双参GCD基础逻辑扩展实现,完全对齐Racket内置gcd、lcm的行为规则。


基础双参实现

我们先封装可复用的双参计算逻辑,补充了非负返回处理适配内置函数行为:

; 基础双参GCD实现
(define (gcd2 a b)
  (if (= b 0)
      (abs a)
      (gcd2 b (remainder a b))))

; 基础双参LCM实现
(define (lcm2 a b)
  (if (or (= a 0) (= b 0))
      0
      (abs (/ (* a b) (gcd2 a b)))))

任意参数实现(foldl版本,写法简洁)

利用Scheme可变参数特性接收任意数量输入,通过foldl递推计算多参数结果:

; 任意参数GCD实现
(define (gcd . args)
  (cond
    ((null? args) 0) ; 无参数返回0,和Racket内置行为一致
    ((null? (cdr args)) (abs (car args))) ; 单参数返回绝对值
    (else (foldl gcd2 (car args) (cdr args)))))

; 任意参数LCM实现
(define (lcm . args)
  (cond
    ((null? args) 1) ; 无参数返回1,和Racket内置行为一致
    ((null? (cdr args)) (abs (car args))) ; 单参数返回绝对值
    (else (foldl lcm2 (car args) (cdr args)))))

纯递归实现(无foldl依赖,兼容性更强)

如果你的Scheme环境不提供foldl,可以用原生递归处理参数列表:

; 纯递归版任意参数GCD
(define (gcd . args)
  (define (recur lst current)
    (if (null? lst)
        current
        (recur (cdr lst) (gcd2 current (car lst)))))
  (cond
    ((null? args) 0)
    ((null? (cdr args)) (abs (car args)))
    (else (recur (cdr args) (car args)))))

; 纯递归版任意参数LCM
(define (lcm . args)
  (define (recur lst current)
    (if (null? lst)
        current
        (recur (cdr lst) (lcm2 current (car lst)))))
  (cond
    ((null? args) 1)
    ((null? (cdr args)) (abs (car args)))
    (else (recur (cdr args) (car args)))))

行为验证示例

所有测试结果和Racket内置函数完全一致:

  • (gcd) → 0
  • (gcd 6) → 6
  • (gcd 12 18 24) → 6
  • (gcd -4 8 12) → 4
  • (lcm) → 1
  • (lcm 5) →5
  • (lcm 3 4 6) → 12
  • (lcm 0 5 10) →0

内容的提问来源于stack exchange,提问作者A needy student

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:45:05