Python 在修改数组的同时创建一个递增数组

Python 在修改数组的同时创建一个递增数组,python,arrays,python-3.x,recursion,Python,Arrays,Python 3.x,Recursion,问:你得到一个由n个整数组成的数组。您希望修改数组,使其增加,即每个元素至少与前一个元素一样大 每次移动时,可以将任何元素的值增加一。所需的最少移动次数是多少 输入: 五, 3 2 5 1 7 输出: 五, 我的解决方案尝试: 输入列表中的元素数 将列表中的元素作为字符串输入,并转换为整数列表 制作一个函数,将移动次数存储为非递增元素的差值。例:在列表[1,2,4,3]中,4大于3,因此它是非递增的,因此我找到了术语之间的差异,并将其添加到移动次数中 将差异添加到较小的项中(即将列表[1,2,4

问:你得到一个由n个整数组成的数组。您希望修改数组,使其增加,即每个元素至少与前一个元素一样大

每次移动时,可以将任何元素的值增加一。所需的最少移动次数是多少

输入:

五,

3 2 5 1 7

输出: 五,

我的解决方案尝试:

  • 输入列表中的元素数
  • 将列表中的元素作为字符串输入,并转换为整数列表
  • 制作一个函数,将移动次数存储为非递增元素的差值。例:在列表[1,2,4,3]中,4大于3,因此它是非递增的,因此我找到了术语之间的差异,并将其添加到移动次数中
  • 将差异添加到较小的项中(即将列表[1,2,4,3]添加到[1,2,4,4])
  • 只要第i项小于列表的第(i+1)个列表,就调用此函数
  • 打印移动的总数
  • 我的代码:

    a = input('')
    b = list(map(int, a.split(' ')))    # split string into a list of numbers
    sum1 = 0
    def moves(i):
        global sum1
        for i in range(len(b)-1):
            if b[i] < b[i+1]:
                sum1 += b[i] - b[i+1]
                b[i + 1] += b[i] - b[i+1]
            else:
                moves(i+1)
    print(sum1)
    moves(0)
    
    
    a=输入(“”)
    b=list(map(int,a.split(“”))#将字符串拆分为数字列表
    sum1=0
    修订动议(i):
    全球sum1
    对于范围内的i(透镜(b)-1):
    如果b[i]

    实现中的错误是什么?如何纠正它?

    递归是完全错误的方法。你所需要的只是浏览一下列表。不要使用globals;只需返回最终结果。请注意,您的比较是反向的。你想要的情况是b[i]>b[i+1],而不是递归是完全错误的方法。你所需要的只是浏览一下列表。不要使用globals;只需返回最终结果。请注意,您的比较是反向的。你想要的是b[i]>b[i+1的情况,而不是 实施过程中出现了什么问题,我如何纠正

    • 在函数中,不打印任何内容。但是,在调用
      moves(0)
      之前,打印
      sum1
      ,但此时
      sum1
      的值仍然为0
    • 您正在混合递归和迭代:for循环本身已经覆盖了整个列表,并且(经过一些更正)已经接近迭代解决问题。仍然需要进行额外的递归调用。既然您已经将问题标记为“递归”,我想您应该想了解递归解决方案在原则上的外观
    • 您的递归尝试将失败,因为
      moves(i)
      获取了一个参数
      i
      ,但您没有使用该参数值并立即覆盖
      i
      for i循环中的
      i
      。因此,每个递归调用都将再次迭代整个列表
    • 比较
      b[i]
      是错误的,因为无论何时
      b[i]b[i+1]:
      sum1+=b[i]-b[i+1]
      b[i+1]+=b[i]-b[i+1]
      移动(i+1)
      移动(0)
      打印(sum1)
      
      此代码有效,但存在一些非功能性质量问题:

      • 应该避免使用globals。这有很好的理由——我建议进行一些研究来理解原因,而不仅仅是把它当作教条来接受。您可以将它们的使用转换为函数参数和返回值的使用
      • 有一些不必要的重复计算:
        b[i]-b[i+1]
        计算两次。这种冗余是不利的(搜索代码重复以了解原因)。您可以在这里使用一个临时变量只计算一次值,但有一种更简单的方法:做一点数学运算,找出
        b[i+1]+=b[i]-b[i+1]
        将产生什么结果
      实施过程中出现了什么问题,我如何纠正

      • 在函数中,不打印任何内容。但是,在调用
        moves(0)
        之前,打印
        sum1
        ,但此时
        sum1
        的值仍然为0
      • 您正在混合递归和迭代:for循环本身已经覆盖了整个列表,并且(经过一些更正)已经接近迭代解决问题。仍然需要进行额外的递归调用。既然您已经将问题标记为“递归”,我想您应该想了解递归解决方案在原则上的外观
      • 您的递归尝试将失败,因为
        moves(i)
        获取了一个参数
        i
        ,但您没有使用该参数值并立即覆盖
        i
        for i循环中的
        i
        。因此,每个递归调用都将再次迭代整个列表
      • 比较
        b[i]
        是错误的,因为无论何时
        b[i]b[i+1]:
        sum1+=b[i]-b[i+1]
        b[i+1]+=b[i]-b[i+1]
        移动(i+1)
        移动(0)
        打印(sum1)
        
        此代码有效,但存在一些非功能性质量问题:

        • 应该避免使用globals。这有很好的理由——我建议进行一些研究来理解原因,而不仅仅是把它当作教条来接受。您可以将它们的使用转换为函数参数和返回值的使用
        • 有一些不必要的重复计算:
          b[i]-b[i+1]
          计算两次。这种冗余是不利的(搜索代码重复以了解原因)。您可以在这里使用一个临时变量只计算一次值,但有一种更简单的方法:做一点数学运算,找出
          b[i+1]+=b[i]-b[i+1]
          将产生什么结果

        它的当前输出是什么?首先不要覆盖Python的内置变量
        sum
        @user202729,它只会为所有内容返回0(将sum更改为sum1后)它的当前输出是什么?首先不要覆盖Python的内置变量
        sum
        @user202729,它只会为所有内容返回0(将sum更改为sum1后),谢谢,很多老实说,我只是随便打字
        a = input('')
        b = list(map(int, a.split()))
        
        def moves(b):
            sum1 = 0
            for i in range(len(b)-1):
                if b[i] > b[i+1]:
                    sum1 += b[i] - b[i+1]
                    b[i+1] = b[i]
            return sum1
        
        print(moves(b))
        
        a = input('')
        b = list(map(int, a.split(' ')))    # split string into a list of numbers
        sum1 = 0
        def moves(i):
            global sum1
            if i < len(b)-1:
                if b[i] > b[i+1]:
                    sum1 += b[i] - b[i+1]
                    b[i+1] += b[i] - b[i+1]
                moves(i+1)
        moves(0)
        print(sum1)