2017-03-29 69 views
-4

當寫一個遞歸函數計算兩個通用函數f1和f2相等的點數(假設只有整數值)時,我得到了這個問題。標識符預期但發現整數立即數

object X1 { 
    def numEqual(f1:Int=>Int,f2:Int=>Int)(a:Int,b:Int):Int= 
    if(a>b) 0 
    else f1(a)==f2(a) ? 1+numEqual(f1,f2)(a+1,b):0+numEqual(f1,f2)(a+1,b) 

而這正是編譯器說:

X1.scala:5: error: identifier expected but integer literal found. f1(a)==f2(a) ? 1+numEqual(f1,f2)(a+1,b) : 0+numEqual(f1,f2)(a+1,b) ^ one error found.

謝謝!

+0

我不明白爲什麼downvotes。這個問題(和答案)幫助了我很多。 –

回答

4

if構建體在Scala是一個表達式。正如其他人已經說過的,沒有三元運營商,因爲不需要它 - 如果已經是表達式。

我重寫你的函數尾遞歸版本(避免StackOverflowError S),讓我們來看看它的樣子:

@tailrec def numEqual(f1: Int => Int, f2: Int => Int)(a: Int, b: Int, res: Int = 0): Int = 
    if (a > b) res 
    else { 
    val inc = if (f1(a) == f2(a)) 1 else 0 
    numEqual(f1, f2)(a + 1, b, res + inc) 
    } 

注意如何,如果表達式的結果分配給inc - 在這裏你會通常使用三元運算符。無論如何,我希望這可以幫助你。

1

? :操作者不存在階