নীচের দিকে স্কেল বা লুপ জন্য হ্রাস?


115

স্কালায়, আপনি প্রায়শই forএকটি ক্রমবর্ধমান ক্রমে একটি লুপ করতে পুনরুক্তি ব্যবহার করেন :

for(i <- 1 to 10){ code }

আপনি এটি কীভাবে করবেন যাতে এটি 10 ​​থেকে 1 অবধি চলে? আমি অনুমান করি 10 to 1একটি খালি পুনরাবৃত্তি দেয় (সাধারণ রেঞ্জের গণিতের মতো)?

আমি একটি স্কালা স্ক্রিপ্ট তৈরি করেছি যা পুনরাবৃত্তির বিপরীতে কল করে এটি সমাধান করে, তবে এটি আমার মতে ভাল নয়, নীচের পথে যাওয়ার উপায় কি?

def nBeers(n:Int) = n match {

    case 0 => ("No more bottles of beer on the wall, no more bottles of beer." +
               "\nGo to the store and buy some more, " +
               "99 bottles of beer on the wall.\n")

    case _ => (n + " bottles of beer on the wall, " + n +
               " bottles of beer.\n" +
               "Take one down and pass it around, " +
              (if((n-1)==0)
                   "no more"
               else
                   (n-1)) +
                   " bottles of beer on the wall.\n")
}

for(b <- (0 to 99).reverse)
    println(nBeers(b))

উত্তর:


229
scala> 10 to 1 by -1
res1: scala.collection.immutable.Range = Range(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

2
@ ফেলিক্স: আপনাকে স্বাগতম আমার এটিও উল্লেখ করা উচিত ছিল যে এখানে untilআপনি toডান হাতের প্রান্তটি বিন্দু থেকে বাদ দেওয়ার জায়গায় ব্যবহার করতে পারেন । বাম-হাতের প্রান্তটি সর্বদা অন্তর্ভুক্ত থাকে।
র‌্যান্ডাল শুল্জ

আমি ইতিমধ্যে ইতিমধ্যে জানতাম, যতক্ষণ না ইন্টিজারে একটি ফাংশন, তবে "দ্বারা" অবশ্যই "থেকে" এবং "অবধি" ফাংশন থেকে যা কিছু ফিরিয়ে দেয় তার পরিসীমা / পুনরাবৃত্তির একটি ফাংশন হতে হবে। যাইহোক ধন্যবাদ :)
ফেলিক্স

5
র্যান্ডাল এর উত্তর সবচেয়ে ভাল, তবে আমি মনে করি এটি Range.inclusive(10, 1, -1)উল্লেখ করার যোগ্য।
জন সোলিভান

37

@ র্যান্ডল থেকে প্রাপ্ত উত্তরটি সোনার হিসাবে ভাল, তবে সমাপ্তির জন্য আমি কয়েকটি ভিন্নতা যুক্ত করতে চেয়েছিলাম:

scala> for (i <- (1 to 10).reverse) {code} //Will count in reverse.

scala> for (i <- 10 to(1,-1)) {code} //Same as with "by", just uglier.

9
প্রথম একের জন্য +1, তবে দ্বিতীয়টিটি মন্দ - কোনও byপাঠেই কম পাঠযোগ্য এবং আইএমও কোনও পরিস্থিতিতে ব্যবহার করা উচিত নয়
সর্ব-মনোনীত-

4
দ্বিতীয়টিটি মন্দ, তবে যা পাওয়া যায় সে সম্পর্কে অন্তর্নিহিততা তৈরি করে
জহির

10

স্কালা নীচের দিকে লুপে কাজ করার বিভিন্ন উপায় সরবরাহ করে।

প্রথম সমাধান: "থেকে" এবং "বাই" দিয়ে

//It will print 10 to 0. Here by -1 means it will decremented by -1.     
for(i <- 10 to 0 by -1){
    println(i)
}

দ্বিতীয় সমাধান: "থেকে" এবং "বিপরীত" সহ

for(i <- (0 to 10).reverse){
    println(i)
}

তৃতীয় সমাধান: কেবলমাত্র "টু" দিয়ে

//Here (0,-1) means the loop will execute till value 0 and decremented by -1.
for(i <- 10 to (0,-1)){
    println(i)
}

6

পাস্কেলে প্রোগ্রাম করার পরে, আমি এই সংজ্ঞাটি ব্যবহার করা ভাল দেখতে পেয়েছি:

implicit class RichInt(val value: Int) extends AnyVal {
  def downto (n: Int) = value to n by -1
  def downtil (n: Int) = value until n by -1
}

এইভাবে ব্যবহৃত:

for (i <- 10 downto 0) println(i)

উত্তরের জন্য ধন্যবাদ। এই সমাধানটি ব্যবহার করতে আমার সমস্যা হচ্ছে। এখানে আমার স্ট্যাকট্র্যাস:Error:(57, 17) value class may not be a member of another class implicit class RichInt(val value: Int) extends AnyVal { ^
রবার্ট

ত্রুটি বার্তাটি (কোনও স্ট্যাক ট্রেস নয়) পরামর্শ দেয়, আপনি অন্য শ্রেণীর অভ্যন্তরের মান শ্রেণিটি নির্ধারণ করতে পারবেন না। হয় এটির বাইরে এটি নির্ধারণ করুন, কোনও বস্তুতে ওক করুন, বা extends AnyValঅংশটি সরিয়ে ফেলুন (যা কেবল কিছু ওভারহেড অপসারণ করতে সাহায্য করে)।
এলপি_

1

আপনি ব্যাপ্তি শ্রেণি ব্যবহার করতে পারেন:

val r1 = new Range(10, 0, -1)
for {
  i <- r1
} println(i)

1

তুমি ব্যবহার করতে পার : for (i <- 0 to 10 reverse) println(i)


0
for (i <- 10 to (0,-1))

লুপটি মান == 0 অবধি কার্যকর করা হবে, প্রতিবার -1 দ্বারা হ্রাস পেয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.