2013-11-09 50 views
1

我是Scala的新手,我必须编写包含内部函数的示例代码。例如,下面给出了这个函数,我明白,当fib被执行时,它立即执行最后一行,即fibS(x,0,1),但是当这个函数停止时我不会得到,因为如果返回z,wouldn'程序再次调用fibS(x,0,1)?由于在Scala中调用内部函数

def fib(x: Long): Long = { 
def fibS(i: Long, z: Long, y: Long): Long = {  
    if (i > 0) 
    fibS(i-1, z+y, z) 
    else z 
} 
fibS(x, 0, 1) 
} 
+2

此代码不正确 - 它甚至没有编译,因为从未定义过“z”。我认为你的意思是用'z'表示'x'。 – ghik

+0

是的,这是一个错字 – user2947615

+0

我不明白在这里投票的原因...... – pedrofurla

回答

2

Scala的定义内的方法是一个范围的问题,所以当你从fibfibS然后调用一个函数一次,一个递归函数,是从其他功能隐藏,因为它是在fib函数中定义。

如果你在外面移动fibS那么你会得到相同的结果。

+0

所以当遇到返回z时,外部方法fib将会被终止? – user2947615

+0

是的,当fibS结束时,fib将返回结果 – barczajozsef

0

一个小例子。假设你有功能ab和另一个callBoth

def a = { ... } 
def b = { ... } 
def callBoth = { 
    a; 
    b; 
} 

当您拨打a会发生什么情况?当你致电b会发生什么?

答:

  • a执行和a后程序流继续。
  • b被执行且程序流程在b之后继续。
  • b之后,它恰好是callBoth的返回,意思是程序流将在所有调用callBoth之后继续。

fibS一样,只是它是一个单一的函数调用。在上面的例子中,单独调用a不会触发b。因此,在呼叫后返回fibS