【问题标题】:Iterative modulo by repeated subtraction?通过重复减法迭代模?
【发布时间】:2013-10-02 04:25:33
【问题描述】:

我正在尝试编写一个迭代过程以使用内置过程模数、余数或 / 在方案中进行模数运算而不。但是我在尝试编写代码时遇到了一些问题,到目前为止看起来像这样:

(define (mod a b)
    (define (mod-iter a b)
        (cond ((= b 0) 0)
              ((< b 0) (+ old_b new_b))))
    (mod-iter a (- a b)))

如您所见,我遇到了需要将 b 的原始值添加到 b 的当前值的问题。我不知道该怎么做。另外,当我将第二个条件的答案保留为原始数据时(只是为了确保整个过程有效),我会收到“未指定的返回值”错误,我不确定为什么会发生这种情况,因为我的代码的其余部分循环(或者看起来如此?) 提前感谢您对此的任何见解。

【问题讨论】:

  • 什么是old_bnew_b
  • 请注意,这种只调用一次的内部定义的使用是使用“命名 let”的绝佳场所,如 @ÓscarLópez 的 recent answer 所示。

标签: scheme


【解决方案1】:

当您使用参数(a b) 定义您的mod-iter 函数时,您将隐藏mod 中定义的参数。为避免阴影,请使用不同的标识符,例如:

(define (mod a b)
  (define (mod-iter ax bx)
    (cond ((= bx 0) 0)
          ((< bx 0) (+ b bx))))
  (mod-iter a (- a b)))

注意,这看起来不像正确的算法(没有递归调用)。 (&gt; bx 0)的常见情况如何处理?你需要类似的东西:

(define (mod a b)
  (define (mod-iter ax bx)
    (cond ((= bx 0) 0)
          ((< bx 0) (+ b bx))
          ((> bx 0) ...)))        ;; <- something here with mod-iter?
  (mod-iter a (- a b)))

【讨论】:

  • 可以使用else,因为如果它不等于或低于它必须更高。
  • mod 结尾处对mod-iter 的调用不正确;它无权访问任何axbx。应该是ab,不是吗?
  • 我意识到我可以使用else,但这会明确列举所有的数字可能性。谢谢。
  • 已修复,原版重写错误。
  • axbxmod 的第一个定义中对@9​​87654337@ 的调用中仍然使用,但应该是ab
【解决方案2】:

首先,如果您不想捕获变量名,请在内部函数中使用不同的变量名。其次,与内置版本相比,我认为这些论点是错误的。 (modulo 5 6) 是 5,(modulo 6 5) 是 1。无论如何,这里是对数时间的变化。基于生成 b 的幂列表 (2 4 8 16 32 ...) 是 b 为 2,一直到略低于 a 的值。然后通过机会性地减去这些相反的值。这样,像 (mod (expt 267 34) 85) 这样的问题会很快返回答案。 (几百个原始函数调用 vs 几百万个)

(define (mod a-in b-in)
 (letrec ((a (abs a-in))
           (sign (if (< 0 b-in) - +))
           (b (abs b-in))
       (powers-list-calc 
        (lambda (next-exponent) 
          (cond ((> b a) '())
            ((=  next-exponent 0) 
            (error "Number 0 passed as the second argument to mod 
                is not in the correct range"))
                   (else (cons next-exponent (powers-list (* b next-exponent))))))))
    (let ((powers-list (reverse (powers-list-calc b))))
      (sign
    (let loop ((a a) (powers-L powers-list))
          (cond ((null? powers-L) a)
                ((> a (car powers-L))
            (loop (- a (car powers-L)) powers-L))
                (else (loop a (cdr powers-L)))))))))

【讨论】:

    猜你喜欢
    • 2014-07-01
    • 2018-08-08
    • 2016-10-24
    • 1970-01-01
    • 2011-03-19
    • 2018-05-28
    • 2016-09-29
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多