2009-09-11 38 views
11

Tôi mới sử dụng Scala, chỉ mới bắt đầu học, vì vậy đây là câu hỏi cơ bản cho người mới bắt đầu.Cách tạo Danh sách từ Phạm vi

Tôi cố gắng triển khai thuật toán Sieve of Eratosthenes. Dưới đây là những gì tôi có cho đến nay:

 
def sieve_core(cross: Int, lst: Seq[Int]): List[Int] = { 
    val crossed = lst.filter(_ % cross != 0) 
    crossed match { 
      case a :: rest => cross :: sieve_core(a, crossed) 
      case _ => cross :: Nil 
    } 
} 

def sieve(max: Int): List[Int] = { 
    sieve_core(2, (2 to max)) 
} 

println(sieve(100)) 

Kết quả là:

 
List(2) 

Theo như tôi hiểu, case _ => cross :: Nil là lần xuất hiện trong lần lặp đầu tiên của sieve_core, có nghĩa là crossed không phải là một thể hiện của một danh sách.

tôi đã thay đổi lst tham số kiểu để List[Int] và bây giờ là mã sẽ không biên dịch với một lỗi:

 
(fragment of Problem3.scala):24: error: type mismatch; 
found : Range.Inclusive 
required: List[Int] 
    sieve_core(2, (2 to max)) 
        ^

Rõ ràng Range không phải là một List.

Câu hỏi: làm cách nào để biến Phạm vi thành Danh sách? Hoặc là nó một số vấn đề lớn hơn với mã của tôi, tôi đã thực hiện một số giả định xấu một nơi nào đó trên đường đi?

Bất kỳ trợ giúp đánh giá cao.

Trả lời

28

Có một phương pháp apply trên đối tượng List đồng mà phải mất một phạm vi và trả về một List:

scala> List.range(2, 11) 
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10) 

Có rất nhiều hữu ích List phương pháp nhà máy in the List collection documentation.

+0

Tôi đã kiểm tra Danh sách lớp apidocs, chưa chọn Danh sách tài liệu đối tượng. Bây giờ tôi biết rõ hơn. Cảm ơn. –

+2

Bạn biết đấy, nó rất khó chịu làm sao chúng không được liên kết nổi bật với nhau, hoặc thậm chí kết hợp thành một trang duy nhất :) –

+2

Điều này được cho là không được chấp nhận, tôi được bảo. '2 to max toList' sẽ hoạt động. –

7

Để bật bất kỳ chuỗi s vào một danh sách, sử dụng s.toList

Tôi chắc chắn digitalross' là hiệu quả hơn trong trường hợp này, mặc dù.

+0

Thực ra, điều này có vẻ là The Scala Way +1 – DigitalRoss

Các vấn đề liên quan