对列表中元素数量的方案限制

时间:2014-09-10 07:24:18

标签: list scheme elements

列表中的元素数量是否有限制?我用以下代码读了一个文件

(define output_collector 
    (let ((p (open-input-file filename_collector)))
        (let f ((x (read p)))
            (if (eof-object? x)
                (begin
                (close-input-port p)
                '())
                (cons x (f (read p)))))))

如果在我的文件中有168行,例如这一行

  

3600 20.4

然后一切正常,但如果有1200行,则存在问题。

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:2)

您必须更具体,但您可能会遇到堆栈溢出。要解决此问题,您需要使用累加器。以下应该有效:

(define output_collector 
  (let ((p (open-input-file filename_collector)))
    (let f ((x (read p)) (acc '()))
      (if (eof-object? x)
          (begin
            (close-input-port p)
            (reverse acc))
          (f (read p) (cons x acc))))))

答案 1 :(得分:0)

如果我们假设您在63位(嵌入指针)和浮点(两个单词)中有一个整数的行,并且利弊使用3个单词(大多数使用2个),则1200行的总空间量将是(* 1200 (* (+ 0 2 3) 8)) ;==> 48000 (Bytes)。对于仅使用指向所有内容的指针的实现将是大约两倍,并且它仍然不是很可怕。

在Ikarus和DrRacket中使用1200行增加整数和浮点数的文件运行代码时,我没有任何问题。 time报告使用了一毫秒来完成此操作。您可以尝试使用下面的迭代替换您的递归,只是为了确保它不是一个堆栈溢出导致您的问题,但说实话,我认为您需要添加有关您获得的特定错误的更多信息。

;; Iterative version. Just for kicks
(define output_collector 
  (with-input-from-file
   filename_collector
   (lambda ()
     (let f ((x (read))(acc '()))
       (if (eof-object? x)
           (reverse acc)
           (f (read) (cons x acc)))))))