我试图理解在我设置了一个数字后,它是如何返回正确的值的,但没有掌握它的作用。
public static boolean isEven(int n){
if (n==1){
return false;
}else {
return !isEven(n-1);
}
}
这是一个递归函数。递归需要两件事。基本情况和向基本情况的进展。在这种情况下,基本情况是n==1,并且通过每次调用函数时递减输入来向基本情况前进。在达到基本情况之前,不会返回任何内容。无论输入什么Integer作为参数,在返回任何值之前,它都将被减为1。一旦达到1,将返回false。然后,每个递归调用都将以与调用时相反的顺序返回。既然他们会回来的!isEven(n(每个调用将交替为true和false,就像每个整数交替为true或false一样。所以最终的返回值总是正确的。
示例:n=4
isEven(4)
isEven(3)
isEven(2)
isEven(1) -> returns false
isEven(2) -> return true
isEven(3) -> returns false
isEven(4) -> returns true
有关递归基础的更多信息https://www.tutorialspoint.com/data_structures_algorithms/recursion_basics.htm
您可以从以下两个例子中理解它:
-
调用
isEven(3)
isEven(3) => !isEven(2) => !isEven(1) returns !false i.e. true returns !true i.e. false
-
呼叫
isEven(4)
isEven(4) => !isEven(3) => !isEven(2) => !isEven(1) returns !false i.e. true returns !true i.e. false returns !false i.e. true
要取消递归过程,请检查递归的内容。在这种情况下,假定语句";CCD_ 3给出了正确的结果";是真的,看看发生了什么。
- 如果
n - 1
是偶数,则isEven(n - 1)
为真;并且n
是奇数,所以返回的结果是正确的 - 如果
n - 1
为奇数,则isEven(n - 1)
为假;n
是偶数,所以在这种情况下结果也是正确的 - 如果
n == 1
,n
是奇数,那么结果是正确的(并且是在没有递归的情况下计算的,基本情况( - 对
isEven()
的每个递归调用都是一个具有较小n
的调用,因此您的递归调用使您(更接近(基本情况。因此,您肯定最终会达到1,递归不会永远持续下去
这本质上是一种几乎不加掩饰的归纳证明。
退一步:每当你试图理解一个调用其他函数的函数时,作为第一步,你会认为其他函数做得很好,(最终(给出了正确的答案,然后从那里开始工作。在您确信经过仔细检查的函数是正确的之后,您就可以使用调用的函数。在某种程度上,您可以达到琐碎的函数,或者认为语言提供的操作是正确的。
这里相同:假设被调用的函数(对于给定的参数(完成了它的工作(不管它是我们正在分析的同一个函数(,并且(在这种情况下是递归的(调用的结果被正确地组合在一起。检查是否有基本情况(没有递归调用(,并且这些调用会让您";更紧密的";到基本情况。
它的工作原理就像一个循环,它经常更改布尔值和数字。因此,当数字为5时,它以false开始,因为它不是1,然后它只更改了4次:false -> true -> false -> true -> false
对于n = 5
:
if (n == 1) {
return false;
} else {
return !isEven(n-1);
}
工作原理与相同
return !(!(!(!(false))));