【问题标题】:isEven recursive requires return statement?isEven 递归需要返回语句?
【发布时间】:2016-02-13 08:16:45
【问题描述】:

我有一个我认为是快速的问题。为什么我需要最后一个 return 语句?递归背后的想法不是我重复调用一个函数直到我得到我想要的答案,然后我返回一个值吗?

// Your code here.  this does work
function isEven(num) {
  if (num == 0) return true;
  else if (num == 1) return false;
  else return isEven(num - 2);
}

// Your code here.  This does not work
function isEven(num) {
  if (num == 0) return true;
  else if (num == 1) return false;
  else isEven(num - 2);
}

【问题讨论】:

  • 每个调用都必须有一个 return 语句才能返回 undefined 以外的内容,否则返回 undefined
  • 在第二个版本中,如果您调用isEven(2),您的函数将返回nothing(嗯,undefined)。当然,它会递归调用自己,那些调用会返回值,但它们会被丢弃。
  • 检查一个数字n是奇数还是偶数O(n)的函数很有趣:)

标签: javascript recursion return


【解决方案1】:

在您的第二个 sn-p 中,递归也在发生,如果您想将递归调用中的值返回给调用者,那么您需要返回它的值。

假设您正在调用 isEven(3),现在 else 部分通过调用 isEvent(3-2) 进行评估,现在第二次调用返回 false,但由于第一次调用没有返回 isEven(1) 返回的值,初始调用者将得到undefined 作为它的答案。

【讨论】:

    【解决方案2】:

    递归背后的想法不是我重复调用一个函数吗 直到我得到我想要的答案,然后我返回一个值?

    是的,你是对的。但是,如果你一开始没有使用 return,那么当你的递归开始时,你最终将什么也不返回,即使子函数确实返回了一些东西。

    你所做的可以通过这段代码来证明:

    function f1() {
        f2();
    }
    
    function f2() {
        return "2";
    }
    

    调用 f1() 不会返回 f2 的值。因为它不是那样写的。

    【讨论】:

      【解决方案3】:

      我会试着用一个生活例子来解释它,这对我来说听起来不错。如果不是,请告诉我。

      想象一下从 1 到无穷大的无限大线。
      还有,有一个经理,手里拿着一堆空纸——他的名字是Main

      Main
      
      0 1 2 3 4 5 6 7 8 9 10 11 ...
      

      他们的工作方式如下:Main 只是给不同的人提供空文件。如果0 的人拿到了这张纸,他会在上面写上“true”并将它归还给刚刚把这张纸交给他的人——无论是Main 还是右边两个位置的人。 Guy 1 也这样做,但写的是“假”。所有其他人都不知道该写什么,所以他们只是将这篇论文传递给左边两个位置的人,当他们得到答案时 - 他们返回这篇论文给原始发件人.

      现在,你给5 一个空文件——他把这个文件传给3,然后他把它传给11 写入“false”并归还纸张给之前的所有者 - 33 将带有珍贵“假”的论文返回给55 又将其返回给原始发件人 - Main

      这正是递归所做的。调用正确的isEven(5) 将返回false

      如果您从else return isEven(num - 2); 行中删除return,则它变为以下内容:

      Main5 一个空纸——他把这个文件传给3,然后他把它传给11 写入“false”并将其返回给 3,但 3 的家伙根本不做任何事情。它点点头,接过纸,然后把它扔进垃圾桶。他不会返回这个给5 的家伙,这没关系,因为5 的家伙并不期待它。他只是把论文传给3,然后忘记了——调用了函数,但没有存储或返回结果。排队的每个人根本不需要这张纸回去。最后,Main 一无所获。他的论文在回来的路上丢失了。

      因此,使用除 0 或 1 之外的所有内容调用错误的 isEven() 将返回 undefined

      【讨论】:

      • 不确定我是否遵循这些...
      猜你喜欢
      • 2015-12-22
      • 2010-10-30
      • 2010-09-23
      • 2019-10-07
      • 2021-11-23
      • 2017-07-21
      • 1970-01-01
      • 2013-03-10
      • 2020-04-11
      相关资源
      最近更新 更多