2014-03-26 162 views
0

爲了解決「Scala for the Impatient」一書中的練習題,我有一個小問題。 (以下是我的解決方案)斯卡拉,用遞歸功能練習

1:編寫for循環來計算字符串中所有字母的Unicode代碼的乘積。例如,在「你好」的字符的產物是825152896

var p = 1; val S = "Hello"       
    for (i <- S) p*= i 
    println(p) 

2:解決上述鍛鍊而無需編寫一個循環。 (提示:看String0ps Scaladoc。)

val St="Hello".map(_.toInt).product ; println(St) 

3:寫功能產品(第:字符串),該計算的乘積,如在前述的練習說明。

def product(s: String)={ 
     val S=s; println(S.map(_.toInt).product) 
    } 
    product("Hello") 
  1. 讓前面的練習遞歸函數的功能。

    ??? I do not know how to do it 
    

我希望有人能幫助我。 此致敬禮, 弗朗切斯科

+1

遞歸函數是一個調用自身的函數,但在執行該操作之前會檢查終止條件以避免無限遞歸。要遞歸地計算一個產品,你需要在函數式語言中實現一個類似'fold'函數的函數,並且傳遞1作爲累加器的初始值和字符串。然後該函數將檢查字符串是否爲空,並用字符串的尾部和調整後的累加器調用它自己,如果不是。終止時,累加器的值就是結果。 – akonsu

回答

0

使用衆所周知的遞歸函數,並修改它們以符合不同的問題可能證明相當有用的方法。

考慮作爲一個初創型的階乘遞歸函數,

def factorial(n: Int): Int = 
    if (n <= 1) 1 else n * factorial (n-1) 

現在考慮其中假設輸入是從1到n的整數列表階乘遞歸函數,所以注意方式輸入列表被減小到基底的情況下,

def factorial(xs: List[Int]): Int = 
    if (xs.isEmpty) 1 else xs.head * factorial (xs.tail) 

這種轉化是現在更接近溶液用於在字符串輸入原來的問題。

0

也許我解決了:

def prodRec(s: String): Int = { 
    var s2 =s.toList 
    if (s2.isEmpty) 1 
    else { 
     s2.head * prodRec (s.tail) 
    } 
} 
+0

對不起,我犯了一個錯誤。甚至不以這種方式工作。 我仍在尋找一些提示。 – user3464253

0

好吧......終於我的代碼工作:

def prodRec(s: String): Int = { 
    if (s.toList.isEmpty) 1  
    else {     
     s.toList.head * prodRec(s.tail) 
    } 
} 
println(prodRec("Hello")) 

我希望這個代碼片段可以幫助別人...... 問候 弗朗切斯科

0

以下是遞歸解決方案寫入產品的另一種方式:

def getProduct(s: String):Int = { 

    def accumulate(acc:Int,ch:Array[Char]):Int = { 
     ch.headOption match { 
      case None => acc 
      case Some(x) => accumulate(acc*x.toInt,ch.tail) 
     } 
    } 
    accumulate(1,s.toArray) 
} 
0

我的尾部遞歸函數的變體。沒有使用變量,這是一個加號。

def product(s: String): Unit = { 
    @tailrec 
    def help(z: Long, array: Array[Char]): Long = { 
     if (array.isEmpty) z else help(z * array.head.toInt, array.tail) 
    } 
    print(help(1L, s.toCharArray)) 
    }