Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将递归函数从python转换为scala_Scala - Fatal编程技术网

将递归函数从python转换为scala

将递归函数从python转换为scala,scala,Scala,我正在尝试将这个递归函数从python代码转换为scala。在python中: def func(x,y,z): if x >= y: return 0.0 if y>= 12: return 1.0/6**z probability = 0.0 for val in [1,2,3,4]: probabil

我正在尝试将这个递归函数从python代码转换为scala。在python中:

    def func(x,y,z):
        if x >= y:
            return 0.0
        if y>= 12:
            return 1.0/6**z
        
        probability = 0.0
        
        for val in [1,2,3,4]:
            probability += func(x,y+val,z+1)        
        for val in [5,6]:
            probability += func(x+val,y,z+1)

        return probability

    print(func(1,7,0))
在scala中,我的代码变成了

object Prob extends App {

  println(func(1, 7, 0))

  def func(y: Int, x: Int, z: Int): Double = { 
    if (x>= y) {
      return 0.0;
    }   
    if (y>= 12) {
      return scala.math.pow(1.0/6,z);
    }
      
    var probability : Double = 0.0;
      
    for (i <- 1 to 4) {
        probability += func(x,y+i,z+1);
    }
    for (i <- 5 to 6) {
        probability += func(x+i,y,z+1);
    }
    return probability;
  }
}
objectprob扩展应用程序{
println(func(1,7,0))
def func(y:Int,x:Int,z:Int):Double={
如果(x>=y){
返回0.0;
}   
如果(y>=12){
返回scala.math.pow(1.0/6,z);
}
风险值概率:双=0.0;

对于(i您交换了参数的顺序:

def func(猎人、鹅、num):
def func(goose:Int,hunter:Int,num:Int):Double={

由于调用了
func(1,7,0)
,在scala中,您立即点击
hunter>=goose
案例,该案例返回
0
,您交换了参数顺序:

def func(猎人、鹅、num):
def func(goose:Int,hunter:Int,num:Int):Double={
由于您调用了
func(1,7,0)
,在scala中,您立即点击了
hunter>=goose
案例,它返回
0
,,这是一个等效的、更惯用的实现,它利用了函数功能,而不仅仅是原始代码的强制复制和粘贴

定义函数(x:Int,y:Int,z:Int):双精度= 如果(x>=y) 0.0d 如果(y>=12),则为else 数学功率(1.0d/6,z) 其他的 (1至6)。折叠英尺(0.0d){ 案例(概率,i)=> 瓦尔r=
if(i这是一个等价的、更惯用的实现,它利用了功能性功能,而不仅仅是原始代码的强制复制和粘贴

定义函数(x:Int,y:Int,z:Int):双精度= 如果(x>=y) 0.0d 如果(y>=12),则为else 数学功率(1.0d/6,z) 其他的 (1至6)。折叠英尺(0.0d){ 案例(概率,i)=> 瓦尔r=
if(我可以问一下为什么使用
case
?这是一种风格上的东西吗?(因为我认为这会导致创建和解构元组)@用户是的,它不应该被需要,因为
foldLeft
需要一个包含两个参数的函数,我已经习惯了。哦,好吧,
map
sum
也可以工作,也许与
视图
一起工作,尽管它与OP的代码不太匹配。@user是的,我也考虑过这一点,但是引入视图或迭代器,请参见我想问你为什么要用大小写?这是一种风格吗?(因为我认为这会减少元组的创建和解构)@用户是的,它不应该被需要,因为
foldLeft
需要一个包含两个参数的函数,我已经习惯了。哦,好吧,
map
sum
也可以工作,也许与
视图
一起工作,尽管它与OP的代码不太匹配。@user是的,我也考虑过这一点,但是引入视图或迭代器,请参见我觉得太多了。