【问题标题】:Using recursion to sum two numbers (python)使用递归对两个数字求和(python)
【发布时间】:2011-02-14 20:56:03
【问题描述】:

假设 y 不是负数,我需要编写一个可以将两个数字 (x, y) 相加的递归函数。我需要使用两个返回 x-1 和 x+1 的函数来完成它,并且我不能在代码中的任何地方使用 + 或 - 。我不知道如何开始,有什么提示吗?

【问题讨论】:

  • 确定不能在任何地方使用+或-?
  • 是的,我不能在任何地方使用 + 或 -。
  • 返回x-1和x+1的两个函数,是给定还是你自己写?
  • 好的,我知道了,谢谢大家。现在,如果有人能告诉我如何让代码整齐地显示,我会是一个快乐的人。
  • 我想log(exp(x)*exp(y)) 也是违反规则的吧?

标签: python function recursion


【解决方案1】:

大提示:你在描述Peano arithmetic

【讨论】:

    【解决方案2】:

    这听起来像是家庭作业。所以这很可能是作弊:

    a+ba.__add__(b) 相同,并且

    a-ba.__sub__(b) 相同。

    因此,您无需使用 +/- 即可轻松添加或减去两个数字。不需要任何递归。

    【讨论】:

      【解决方案3】:

      可以这么说

      succ(x)=x+1
      pre(x)=x-1
      

      那么,(伪代码)

      add(x,y) = {
          If(y==0) Return x;
          Return add(succ(x),pre(y))
      }
      

      注意,这仅适用于非负 y。

      【讨论】:

      • 好的,我想我明白了。我知道 (x-1) + (y+1) 将与 x + y 相同。您所做的与我尝试的非常相似,但出现错误 - “超出最大递归深度”。我会发布我的代码,但我不知道如何正确格式化它,是否有链接或什么?常见问题解答中没有任何相关信息。
      • @James:只需将每行缩进四个空格。有关更多格式信息,请在帖子编辑器工具栏中查找橙色问号。
      【解决方案4】:

      伪代码:

      for i = 0 to y
          x = f(x)
      next
      

      其中 f(x) 是返回 x+1 的函数

      或者,如果您不能执行 for 循环,因为这需要 +s :

      while (y > 0) {
          x = f(x)
          y = g(y)
      }
      

      其中 f(x) 是给出 x+1 的函数,g(y) 是给出 y-1 的函数

      【讨论】:

      • 我修正了你拼错的“伪”。请注意,您的答案包含不是 python 的代码,它位于问题的标签上。
      • 轻笑 谢谢你,已经很晚了。我不是 python 专家,所以这就是为什么我写伪代码(或者不管你拼写如何),但我相信将 3 或 4 行转换为正确的 python 并不难......
      【解决方案5】:

      OP 在评论中说:

      我得到一个错误 - “最大递归 超出深度”。

      您可以尝试使用sys.recursionlimit 提高递归限制(当然是在import sys 之后),但这只会让您达到一定程度。 Python没有被称为“尾递归消除”的优化,它(可能是美妙的语言;-)并没有使它成为用于特定目的的递归教学的最佳语言(最好的语言,恕我直言,但不是只是在我看来,应该是 Scheme 或 Lisp 的一些变体)。因此,当y 大于您可以在机器上设置的最大递归限制(取决于系统)时,将不可避免地出现该错误。

      或者,您可能错误地编码了“基本递归保护”,当y 等于0 时,它应该返回而无需进一步递归,或者您可能尝试使用y < 0 调用该函数(这将不可避免地“无限递归”,即不可避免地超过最大递归限制时产生上述错误。

      【讨论】:

        【解决方案6】:
        def sum(a,b):
            if b==0:
                return a
            return sum(a+1,b-1)
        

        【讨论】:

          猜你喜欢
          • 2020-08-22
          • 2021-10-14
          • 2016-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-18
          相关资源
          最近更新 更多