【问题标题】:How do I do this "If n is 3, return `1+..1+2+..1+2+3+..`"我该怎么做“如果 n 为 3,则返回 `1+..1+2+..1+2+3+..`”
【发布时间】:2016-11-16 20:40:01
【问题描述】:

定义一个名为 nested_increasing_additions(n) 的函数,它接收一个正整数 (n)返回一个字符串,如下例所示:

如果n3,函数应该返回字符串: 1+..1+2+..1+2+3+..

如果n5,函数应该返回字符串: 1+..1+2+..1+2+3+..1+2+3+4+..1+2+3+4+5..+

我的想法是,我可以将n 设为列表[1,2,3] 并使用while 循环或for 循环重复n 次。对于第一个循环,它返回1+..,对于第二个循环,它以某种方式返回1+2..(我不知道)它停在2,这与重复时间相同。

我不知道我的想法是否正确。需要一些帮助和解释!谢谢!

【问题讨论】:

  • 你能展示你的代码吗?
  • 为什么你的第一个字符串以.. 结尾,而第二个不是?

标签: python python-3.x for-loop while-loop


【解决方案1】:

对这些字符串的连续求值会产生一系列四面体数。例如,对于输入 5,输出计算结果为 35。这是构建边长为 5 的四面体所需的球体数。

要了解它与问题中的总和有何关系,请注意四面体的离散“体积”将等于从上到下的三角形“切片”的总和。

35 = 1 + 3 + 6 + 10 + 15
   = 1 + (1+2) + (1+2+3) + (1+2+3+4) + (1+2+3+4+5)

通过类似的论点,三角形数由连续整数的切片组成。


请原谅数学问题,将封闭形式的解决方案调整为所需的输出格式很困难(但并非不可能)。

def tetrahedral(n): 
    return n*(n+1)*(n+2)//6


def string_generator(n):
    x = tetrahedral(n)
    n = N = 1
    while x > 0:
        while n <= N:
            yield str(n) + '+'
            n += 1
        x -= N*(N+1)//2
        n = 1
        N += 1
        yield '..'


def nested_increasing_additions(n):
    return ''.join(string_generator(n))

【讨论】:

  • "函数应该返回字符串"强调我的
  • 获得书呆子狙击的全新水平,恭喜!
【解决方案2】:

您可以逐步构建完整的字符串,并在每一步中记住您最后添加的内容:

def nested_increasing_additions(n):
    complete_string = ""
    add_string = ""
    for i in range(1,n+1):
        add_string += str(i) + "+"
        complete_string += add_string + ".."
    return complete_string

print(nested_increasing_additions(1))
print(nested_increasing_additions(3))
print(nested_increasing_additions(5))

python3 的输出是:

1+..
1+..1+2+..1+2+3+..
1+..1+2+..1+2+3+..1+2+3+4+..1+2+3+4+5+..

【讨论】:

    【解决方案3】:
    def nested_increasing_additions(n):
        l=['']
        for i in range(1, n+1):
            l.append(l[-1]+str(i)+'+')
        return '..'.join(l[1:])
    

    这将返回一个结尾没有.. 的字符串。如果你想这样做,只需return '..'.join(l[1:]) + '..'

    【讨论】:

      【解决方案4】:

      你可以使用这样的东西。

      def nested_increasing_additions(n):
          string = ""
          for i in range(1,n+1): #1
              for j in range(1,i+1): #2
                  string += str(j)+"+" #4
              string += ".." #5
          print(string)
      

      这是nested_increasing_additions(4) 的打印输出 1+..1+2+..1+2+3+..1+2+3+4+.. 我认为这是不言自明的,没有什么复杂的。

      【讨论】:

        【解决方案5】:

        这是怎么回事:

        def nested_increasing_additions(n):
        
            string = ""
            new_string = ""
            dot = ".."
        
            for i in range(1, n+1):
                new_string+=('{}+'.format(i))
                string = string+new_string+dot
                print(string)
        
            return (string)
        

        输出:

        nested_increasing_additions(3)    
        
        '1+..1+2+..1+2+3+..'
        

        【讨论】:

          【解决方案6】:

          假设您确实希望在每个返回的字符串末尾加上 ".." 并且递归是可以的,这里有一个解决方案:

          def nested_increasing_additions(n):
              if n == 1:
                  return "1+.."
              else:
                  return nested_increasing_additions(n-1) + '%s+..' % '+'.join(str(i) for i in range(1, n+1))
          
          print(nested_increasing_additions(3))
          print(nested_increasing_additions(5))
          type(nested_increasing_additions(1))
          

          打印

          1+..1+2+..1+2+3+..
          1+..1+2+..1+2+3+..1+2+3+4+..1+2+3+4+5+..
          <type 'str'>
          


          说明

          • 当传入的参数值通过另一半的减法达到 1 时,第一个 return 和 if (true) 块结束递归调用。
          • 后半部分(else 块)调用下一次迭代,n 减 1 和当前迭代的字符串构建(如果 n!=1)。
          • 看起来很复杂的代码'%s+..' % '+'.join(str(i) for i in range(1, n+1))只是range函数生成的数字列表的串联,变成字符串和"+.."
            • range(1, n+1) 返回从 1 到 n+1 的整数列表,因此 range(1,3) 产生 [1,2]。这被传递给 join,在每个数字之间放置一个 +

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-01-09
            • 2012-07-30
            • 2010-12-02
            • 2018-01-31
            • 2011-01-29
            • 2023-01-16
            • 2022-11-13
            相关资源
            最近更新 更多