将递归函数从python转换为scala
我正在尝试将这个递归函数从python代码转换为scala。在python中:将递归函数从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
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是的,我也考虑过这一点,但是引入视图或迭代器,请参见我觉得太多了。