2012-05-16 75 views
1

我正在處理一些歐拉項目問題,需要一些幫助來了解我找到的解決方案。無法找出設置值的位置

我的問題是:在哪裏heck是X被設置在SkipWhile方法調用?當我在運行時中斷代碼並逐步完成這一點時,我從未看到爲它設置的值。但是代碼會一直工作。我檢查了SkipWhile的定義,也許我不明白在調用中傳遞的參數是如何滿足3參數方法定義的。 Math.Pow也一樣 - X在哪裏設置!?

public long FindGreatestPrimeFactor(long factorGreaterThan, long number) 
    { 
     long upperBound = (long)Math.Ceiling(Math.Sqrt(number)); 

     // find next factor of number 
     long nextFactor = Range(factorGreaterThan + 1, upperBound) 
      .SkipWhile(x => number % x > 0).FirstOrDefault(); 

     // if no other factor was found, then the number must be prime 
     if (nextFactor == 0) 
     { 
      return number; 
     } 
     else 
     { 
      // find the multiplicity of the factor 
      long multiplicity = Enumerable.Range(1, Int32.MaxValue) 
       .TakeWhile(x => number % (long)Math.Pow(nextFactor, x) == 0) 
       .Last(); 

      long quotient = number/(long)Math.Pow(nextFactor, multiplicity); 

      if (quotient == 1) 
      { 
       return nextFactor; 
      } 
      else 
      { 
       return FindGreatestPrimeFactor(nextFactor, quotient); 
      } 
     } 
    } 

    private IEnumerable<long> Range(long first, long last) 
    { 
     for (long i = first; i <= last; i++) 
     { 
      yield return i; 
     } 
    } 

回答

0

SkipWhileRange方法檢索其輸入值(x),這反過來又返回從factorGreaterThan + 1號碼可達upperBound。不知道爲什麼作者決定爲此寫一個方法,因爲這是用Enumerable.Range方法構建的。

+0

內建的'EnumerableRange'與'int'一起使用,而不是'long' - 也許這就是原因。 – Oded

+0

yes - good catch – BrokenGlass

2

我相信你所談論的lambda expression

x => number % x > 0 

所有lambda表達式使用拉姆達運算符=>,它讀作 「去」。 lambda運算符的左側指定輸入參數(如果有的話),右側保存表達式或語句塊。

在LINQ表達式中,迭代時每個項都被提供給lambda。在lambda的主體中,如果你想參考這個項目,你需要給它一個名字。在這種情況下,參數結束命名爲x

+0

那麼X在這一行的價值究竟是什麼?我認爲我在概念上被卡住了,因爲我正在閱讀它:X被設置爲數字,x mod本身必須大於0. – LikwidZero

+0

@ user178471 - 'Range'返回'long'的_list_。當你迭代列表時,你一次向lambda提供一個'long',由函數處理('=>'右側)。 – Oded

+0

@ user178471 - [從代表到lambda](http://www.devx.com/codemag/Article/39674/0/page/1)可能有助於理解什麼lambda是。 – Oded

2

看起來像這樣的表達:

x => number % x > 0 

被稱爲lambda expressions。他們實際上是功能,並且x是一個參數。 SkipWhile接受一個函數,然後使用其參數的不同值執行它。

這裏是lambda表達式將如何被寫成一個函數:

bool Foobar(long x) 
{ 
    return number % x > 0; 
} 

SkipWhile,我相信函數調用x是在列表中的第一項。如果是,則使用列表中的第二項再次調用該函數,依此類推,直到該函數返回false。

在這種情況下,SkipWhile正在詢問函數,該函數將列表中類型的值轉換爲bool。 Lambda表達式是一種簡潔的表達方式。