Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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
Java Scala reduce and fold返回0而不是值_Java_Scala_Reduce_Scala Collections_Fold - Fatal编程技术网

Java Scala reduce and fold返回0而不是值

Java Scala reduce and fold返回0而不是值,java,scala,reduce,scala-collections,fold,Java,Scala,Reduce,Scala Collections,Fold,嘿,我有一个案例,我试着在REPL上运行这个: (1 to 100).toList.reduce(_*_) 它返回给我0。我不理解这种行为。如果Int已溢出,则应返回任何负数或正数。我很好奇,所以我试了一下: (1 to 100).toList.fold(1)(_*_) (1 to 100).toList.fold(1)((a,b) => { println(s"dd::::$a:::$b"); a*b }) 它仍然返回给我0 然后我试了一下: (1 to 100).toList.f

嘿,我有一个案例,我试着在REPL上运行这个:

(1 to 100).toList.reduce(_*_)

它返回给我0。我不理解这种行为。如果Int已溢出,则应返回任何负数或正数。我很好奇,所以我试了一下:

(1 to 100).toList.fold(1)(_*_)
(1 to 100).toList.fold(1)((a,b) => { println(s"dd::::$a:::$b"); a*b })
它仍然返回给我0 然后我试了一下:

(1 to 100).toList.fold(1)(_*_)
(1 to 100).toList.fold(1)((a,b) => { println(s"dd::::$a:::$b"); a*b })
它返回给我:

scala> res0.toList.fold(1)((a,b) => { println(s"dd::::$a:::$b"); a*b })
dd::::1:::1
dd::::1:::2
dd::::2:::3
dd::::6:::4
dd::::24:::5
dd::::120:::6
dd::::720:::7
dd::::5040:::8
dd::::40320:::9
dd::::362880:::10
dd::::3628800:::11
dd::::39916800:::12
dd::::479001600:::13
dd::::1932053504:::14
dd::::1278945280:::15
dd::::2004310016:::16
dd::::2004189184:::17
dd::::-288522240:::18
dd::::-898433024:::19
dd::::109641728:::20
dd::::-2102132736:::21
dd::::-1195114496:::22
dd::::-522715136:::23
dd::::862453760:::24
dd::::-775946240:::25
dd::::2076180480:::26
dd::::-1853882368:::27
dd::::1484783616:::28
dd::::-1375731712:::29
dd::::-1241513984:::30
dd::::1409286144:::31
dd::::738197504:::32
dd::::-2147483648:::33
dd::::-2147483648:::34
dd::::0:::35
dd::::0:::36
dd::::0:::37
dd::::0:::38
dd::::0:::39
dd::::0:::40
dd::::0:::41
dd::::0:::42
dd::::0:::43
dd::::0:::44
dd::::0:::45
dd::::0:::46
dd::::0:::47
dd::::0:::48
dd::::0:::49
dd::::0:::50
dd::::0:::51
dd::::0:::52
dd::::0:::53
dd::::0:::54
dd::::0:::55
dd::::0:::56
dd::::0:::57
dd::::0:::58
dd::::0:::59
dd::::0:::60
dd::::0:::61
dd::::0:::62
dd::::0:::63
dd::::0:::64
dd::::0:::65
dd::::0:::66
dd::::0:::67
dd::::0:::68
dd::::0:::69
dd::::0:::70
dd::::0:::71
dd::::0:::72
dd::::0:::73
dd::::0:::74
dd::::0:::75
dd::::0:::76
dd::::0:::77
dd::::0:::78
dd::::0:::79
dd::::0:::80
dd::::0:::81
dd::::0:::82
dd::::0:::83
dd::::0:::84
dd::::0:::85
dd::::0:::86
dd::::0:::87
dd::::0:::88
dd::::0:::89
dd::::0:::90
dd::::0:::91
dd::::0:::92
dd::::0:::93
dd::::0:::94
dd::::0:::95
dd::::0:::96
dd::::0:::97
dd::::0:::98
dd::::0:::99
dd::::0:::100
res5: Int = 0

我不清楚这种行为。谁能帮忙吗!感谢

执行以下操作以了解发生了什么:

val x = Int.MinValue
x - 1 // = Int.MaxValue-1
x + x // = 0
x + x + x // = Int.MinValue
从Int.MinValue中减去时,从最大值开始。如果你从MinValue(MinValue*2)中减去abs(MinValue),你将在MaxValue的左边执行abs(MinValue)步骤,这将使你达到0

这种行为会导致出现MinValue*偶数=0,MinValue*奇数=MinValue的情况


这两种行为都发生在第33-34行,当然,一旦其中一个结果为0,所有其他结果也将为0。

执行以下操作以了解发生了什么:

val x = Int.MinValue
x - 1 // = Int.MaxValue-1
x + x // = 0
x + x + x // = Int.MinValue
从Int.MinValue中减去时,从最大值开始。如果你从MinValue(MinValue*2)中减去abs(MinValue),你将在MaxValue的左边执行abs(MinValue)步骤,这将使你达到0

这种行为会导致出现MinValue*偶数=0,MinValue*奇数=MinValue的情况


这两种行为都发生在第33-34行,当然,一旦其中一个结果为0,所有其他结果也将为0。

在您的输出中有一行,如:
dd:::-2147483648:::34
,它将
0
作为输出。因此,所有后续乘法都会导致
0

原因是
-2147483648
最小值为
Int
Int.MinValue


如果在REPL中尝试
-2147483648+-2147483648
,由于
Int
溢出,输出将为
0
。现在,当您执行
-2147483648*34
时,它相当于
(-2147483648+(-2147483648))*17
,因此输出是
0
在您的输出中有一行类似于:
dd::-2147483648:::34
,它将
0
作为输出。因此,所有后续乘法都会导致
0

原因是
-2147483648
最小值为
Int
Int.MinValue

如果在REPL中尝试
-2147483648+-2147483648
,由于
Int
溢出,输出将为
0
。现在,当您执行
-2147483648*34
时,它相当于
(-2147483648+(-2147483648))*17
,因此输出为
0

我不清楚这种行为

一般来说,你所经历的是。如果您想精确指出第34个值返回0的原因,那么手工计算会有所帮助

第33个产品的结果是
-2147483648
,即:

64bit hex: 0x‭FFFFFFFF80000000‬
32bit hex: 0x80000000

64bit binary: ‭1111111111111111111111111111111110000000000000000000000000000000‬
32bit binary: 10000000000000000000000000000000
我们把它乘以34,我们得到:

64bit hex: ‭0xFFFFFFEF00000000‬
32bit hex: 0x00000000‬

64bit binary: ‭1111111111111111111111111110111100000000000000000000000000000000‬
32bit binary: 00000000000000000000000000000000‬
由于
Int
查看较低的32位,因此得到
0
。从这里开始的所有操作都将导致
0
,因为这是累加器值,您正在进行乘法

我不清楚这种行为

一般来说,你所经历的是。如果您想精确指出第34个值返回0的原因,那么手工计算会有所帮助

第33个产品的结果是
-2147483648
,即:

64bit hex: 0x‭FFFFFFFF80000000‬
32bit hex: 0x80000000

64bit binary: ‭1111111111111111111111111111111110000000000000000000000000000000‬
32bit binary: 10000000000000000000000000000000
我们把它乘以34,我们得到:

64bit hex: ‭0xFFFFFFEF00000000‬
32bit hex: 0x00000000‬

64bit binary: ‭1111111111111111111111111110111100000000000000000000000000000000‬
32bit binary: 00000000000000000000000000000000‬

由于
Int
查看较低的32位,因此得到
0
。从这里开始的所有操作都将导致
0
,因为这是累加器值,您正在执行乘法。

整数溢出呢?“如果整数溢出,它应该返回任何负数或正数。”为什么您认为它不能返回0?整数溢出呢?“如果Int已溢出,它应该返回任何负数或正数。”为什么您认为它不能返回0?