【问题标题】:Why does `-` parameter order cause Racket REPL to run out of memory?为什么`-`参数顺序会导致Racket REPL内存不足?
【发布时间】:2015-02-17 20:59:53
【问题描述】:

我在将参数的顺序交换到 - 函数时发现了一个问题。

; source

(define (compose f g) (lambda (x) (f (g x))))

(define (repeated f n)
  (if (= n 1)
    f
    (compose f (repeated f (- 1 n))) ; causes an out of memory error
    (compose f (repeated f (- n 1))) ; runs without issue
))

(define (square n) (* n n))
((repeated square 2) 6) ; 1296


; REPL

> > Racket virtual machine has run out of memory; aborting
Aborted (core dumped)

如果我对值进行硬编码,问题就存在了。此外,如果我使用+ 增加n,则问题不适用。

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    当您以 n 开头为 2 时,您可以调用 (repeated f (- 1 2))。 (- 1 2)是-1,不等于1,所以继续(repeated f (- 1 -1))。 (- 1 -1) 是 2,所以你再次调用 (repeated f 2),你就进入了一个无限循环。

    当使用以(- 2 1) 开头的其他顺序时,即1,这就是递归停止的地方。

    换句话说:如果你从一个大于1 的数字开始,然后不断地从n 中减去1,你最终会得到1,并且递归将停止。如果您改为从 1 中减去 n,您将进入一个循环,并且递归将永远持续下去(或者更确切地说,直到您耗尽内存)。

    加法不会出现同样的问题,因为加法是可交换的。也就是说,将x 添加到y 并将y 添加到x 会产生完全相同的结果。减法也不一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-25
      • 2017-07-13
      • 2013-07-12
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多