2012-04-02 34 views
7

Ngày đầu tiên và lần đầu tiên sử dụng Scala - vì vậy hãy dễ dàng với tôi! Tôi đang cố gắng để viết lại một số mã Java cũ tôi có mà chỉ đơn giản là một chức năng mà có hai con số và in ra các con số từ x đến y. Ví dụ: tôi có chức năng gia tăng:Giảm vòng lặp tại Scala?

def increment(start: Int, finish: Int) = { 
     for (i <- start to finish) { 
     println("Current value (increasing from "+start+" to "+finish+") is "+i) 
     } 
    } 

Tuy nhiên, im đấu tranh viết chức năng giảm tương ứng sẽ giảm từ đầu đến cuối? Tôi đã đọc Scala downwards or decreasing for loop? nhưng tôi vẫn không chắc chắn

Cảm ơn bạn

Trả lời

15
scala>def decrement(start: Int, finish: Int) = { 
    | for (i <- start to finish by -1) 
    | println("Current value (decreasing from "+start+" to "+finish+") is "+i); 
    | } 
decrement: (start: Int,finish: Int)Unit 

scala> decrement(10, 1) 
Current value (decreasing from 10 to 1) is 10 
Current value (decreasing from 10 to 1) is 9 
Current value (decreasing from 10 to 1) is 8 
Current value (decreasing from 10 to 1) is 7 
Current value (decreasing from 10 to 1) is 6 
Current value (decreasing from 10 to 1) is 5 
Current value (decreasing from 10 to 1) is 4 
Current value (decreasing from 10 to 1) is 3 
Current value (decreasing from 10 to 1) is 2 
Current value (decreasing from 10 to 1) is 1 
+0

Lời cảm ơn hoàn hảo. Bây giờ tôi không có ý tưởng làm thế nào tôi đã không nhìn thấy rằng từ http://stackoverflow.com/questions/2617513/scala-downwards-or-decreasing-for-loop?answertab=votes#tab-top Chắc chắn không phải suy nghĩ thẳng! – rwb

+0

@Ryan: Không sao cả! :) – dacwe

+0

Một điều nữa - xin lỗi. Làm thế nào tôi sẽ nhận được giá trị của iterator trong println? – rwb

4
for (i <- (6 to 3 by -1)) {println ("i: " + i)} 
i: 6 
i: 5 
i: 4 
i: 3 

Nếu bạn tình cờ quên by -1, bạn có thể di chuyển lên và sử dụng một chức năng, để phục hồi các kết quả:

for (i <- (3 to 6)) {println ("i: " + ((6+3) - i))} 

Để loại trừ ranh giới thứ hai, sử dụng until:

for (i <- (6 until 3 by -1)) {println ("i: " + i)} 
i: 6 
i: 5 
i: 4 

Ngoài ra, bạn có thể xác định một Iterator cho mục đích của bạn. Mở rộng một Iterator là dễ dàng; chỉ cần thực hiện 'hasNext: Boolean' và 'Next: [T]', trong đó T là loại để xử lý - trong trường hợp Int của chúng tôi hoặc có thể dài hoặc bigint:

class FromToIterator (start: Int, stop: Int) extends Iterator [Int] { 
    var current = start 
    //      3  6  3   6   6  3  6   3 
    def hasNext : Boolean = ((start < stop && current <= stop) || (start > stop && current >= stop)) 
    def next: Int = { 
    val res = current 
    if (start < stop) current += 1 else current -= 1 
    res 
    } 
} 
val it = new FromToIterator (3, 6) 
val ti = new FromToIterator (6, 3) 

for (i <-it) println (i) 
for (i <-ti) println (i) 
0

Dưới đây là một số gia toàn cầu/giải pháp sụt lần lấy cảm hứng từ Scala downwards or decreasing for loop?:

def goThrough(start: Int, finish: Int) = {  
    val d = if(start<=finish) 1 else -1 
    for (i <- start to finish by d) { 
    println("Current value (increasing from "+start+" to "+finish+") is "+i) 
    } 
} 
1

highnum để lownum bằng -1 (switch với bước tiêu cực hoặc tích cực khác để thay đổi bước)

def decrement(start: Int, finish: Int) = { 
    for (i <- start to finish by -1) { 
    println("Current value (decreasing from "+start+" to "+finish+") is "+i) 
    } 
} 

Tôi nghĩ đây là một bản dupe của Scala downwards or decreasing for loop?

0
object Test extends App{ 

    def decrement(start: Int, finish: Int,dec :Int) = { 
    for (i <- Range(start,finish,dec)) { 
     println("Current value (decreasing from "+start+" to "+finish+") is "+i) 
    } 
    } 

    decrement(5,0,-1) 
} 

Đây cũng là một phương pháp.nhưng có thể không phải là

0
def printInDecreasingOrder(start : Int, end : Int){ 
    if(start > end){ 
    for(i <- start to end by -1){ 
     println(s"Current value (decreasing from $start to $end) is $i") 
    } 
    }else{ 
    println("first num is smaller than second") 
    } 
} 

gọi phương thức tốt nhất:

printInDecreasingOrder(10, 2)

Kết quả:

Giá trị hiện tại (trung bình giảm 10-2) 10

Giá trị hiện tại (trung bình giảm từ 10 đến 2) là 9

Giá trị hiện tại (d ecreasing 10-2) 8

Giá trị hiện tại (trung bình giảm 10-2) là 7

Giá trị hiện tại (trung bình giảm 10-2) 6

Giá trị hiện tại (trung bình giảm 10-2) là 5

giá trị hiện tại (trung bình giảm 10-2) được 4

giá trị hiện tại (trung bình giảm 10-2) 3

giá trị hiện tại (Giảm 10-2) là 2

printInDecreasingOrder(1, 10)

Kết quả:

num đầu tiên là nhỏ hơn so với thứ hai

0

Bằng cách này bạn có thể sử dụng Giảm vòng lặp for trong Scala.

object Example extends App { 


     for(i <- 20 to 2 by -2){ 


     println("Value of i = "+ i) 

     } 
    } 
------------------ 
O/P 
------------------ 
Value of i = 20 
Value of i = 18 
Value of i = 16 
Value of i = 14 
Value of i = 12 
Value of i = 10 
Value of i = 8 
Value of i = 6 
Value of i = 4 
Value of i = 2 
Các vấn đề liên quan