计划cond卡在循环中

时间:2015-09-26 14:56:55

标签: scheme

**Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.3.13/$rootScope/infdig?p0=10&p1=%5B%5D
    at REGEX_STRING_REGEXP (ionic.bundle.js:8762)
    at Scope.promises.$get.Scope.$digest (ionic.bundle.js:22980)
    at Scope.promises.$get.Scope.$apply (ionic.bundle.js:23205)
    at done (ionic.bundle.js:18358)
    at completeRequest (ionic.bundle.js:18548)
    at XMLHttpRequest.requestLoaded (ionic.bundle.js:18489)(anonymous function) @ ionic.bundle.js:20306jqNodes.$get @ ionic.bundle.js:17256promises.$get.Scope.$apply @ ionic.bundle.js:23207done @ ionic.bundle.js:18358completeRequest @ ionic.bundle.js:18548requestLoaded @ ionic.bundle.js:18489
ionic.bundle.js:8762 Uncaught Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.3.13/$rootScope/infdig?p0=10&p1=%5B%5DREGEX_STRING_REGEXP @ ionic.bundle.js:8762promises.$get.Scope.$digest @ ionic.bundle.js:22980promises.$get.Scope.$apply @ ionic.bundle.js:23205done @ ionic.bundle.js:18358completeRequest @ ionic.bundle.js:18548requestLoaded @ ionic.bundle.js:18489
ionic.bundle.js:20306 Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.3.13/$rootScope/infdig?p0=10&p1=%5B%5D
    at REGEX_STRING_REGEXP (ionic.bundle.js:8762)
    at Scope.promises.$get.Scope.$digest (ionic.bundle.js:22980)
    at Scope.promises.$get.Scope.$apply (ionic.bundle.js:23205)
    at done (ionic.bundle.js:18358)
    at completeRequest (ionic.bundle.js:18548)
    at XMLHttpRequest.requestLoaded**

您好,这是尾递归函数的方案递归函数。 cond部分似乎有问题,因为它开始陷入循环。可能存在语法错误,因为当我在终端中尝试时,代码行似乎单独工作。

1 个答案:

答案 0 :(得分:2)

我将根据两个见解重新制定你的功能:

  1. 方案列表不是随机访问,因此使用列表索引不是一个好方法。 (特别是,list-reflist-set!都是O(n)操作。)
  2. 使用广泛的突变也不是很方便。事实上,一些实现,如Racket,有不可变的列表。
  3. 这里是我如何使用相同的算法重写函数(注意你的排序不容易实现而没有变异(相比之下,你可以实现mergesort而没有任何变异),所以我的版本仍然有一些变异,但不如你的那么多; - )):

    (define (sort! lst)
      (let outer ((lhs lst))
        (unless (null? lhs)
          (let inner ((rhs (cdr lhs)))
            (if (null? rhs)
                (outer (cdr lhs))
                (let ((a (car lhs))
                      (b (car rhs)))
                  (when (> a b)
                    (set-car! lhs b)
                    (set-car! rhs a))
                  (inner (cdr rhs))))))))
    

    请注意,使用此内/外循环结构比您拥有的cond更干净,因此我的版本根本不使用cond

    使用示例(在Guile上测试):

    > (define lst (list 3 1 4 1 5 9))   ; important: **not** '(3 1 4 1 5 9)
    > (sort! lst)
    > lst
    (1 1 3 4 5 9)
    

    如果您想使用随机访问数据结构,那么在Scheme中称为 vector 。这里的矢量算法相同:

    (define (sort! vec)
      (let outer ((i 0))
        (unless (>= i (vector-length vec))
          (let inner ((j (+ i 1)))
            (if (>= j (vector-length vec))
                (outer (+ i 1))
                (let ((a (vector-ref vec i))
                      (b (vector-ref vec j)))
                  (when (> a b)
                    (vector-set! vec i b)
                    (vector-set! vec j a))
                  (inner (+ j 1))))))))
    

    请注意,我使用ij作为左手和右手矢量索引,而不是lhsrhs左手和右手 - 手"游标"我用于列表版本。

    示例用法(在Racket上测试):

    > (define vec (vector 3 1 4 1 5 9))
    > (sort! vec)
    > vec
    #(1 1 3 4 5 9)