有人能解释一下这是如何为每个整数返回正确的布尔值的吗



我试图理解在我设置了一个数字后,它是如何返回正确的值的,但没有掌握它的作用。

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

您可以从以下两个例子中理解它:

  1. 调用isEven(3)

    isEven(3) => !isEven(2) => !isEven(1)
    returns !false i.e. true
    returns !true i.e. false
    
  2. 呼叫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 == 1n是奇数,那么结果是正确的(并且是在没有递归的情况下计算的,基本情况(
  • 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))));

最新更新