【问题标题】:Functional programming method, or most Pythonic way, to loop over an array using two adjacent variables at a time函数式编程方法,或大多数 Pythonic 方法,一次使用两个相邻变量循环数组
【发布时间】:2016-10-13 06:34:45
【问题描述】:

考虑问题:给定一个整数数组,返回数组递减的次数。所以 [3,2,1] 减少了两次(在 3 和 2 处); [1,2,3,4,5,4,3,2,1] 减少了 4 倍(在 5、4、3、2 处),而 [1] 没有减少。

用任何语言在 for 循环中解决这个问题都非常容易:

int result = 0;
for (int i = 0; i < array.length - 1; i++) {
    if (array[i] > array[i+1]) result += 1;
}

我只知道如何使用 for 或 while 循环并跟踪索引来解决这个问题。我不知道使用map 之类的方法或使用列表或推导式的任何功能方式,但我希望这就是存在的。

【问题讨论】:

  • “不使用 for 或 while 循环,或跟踪索引,或使用功能工具箱方法,如 map 或过滤器或理解。” - 我不知道你在找什么。没有其他东西了。
  • @KarolyHorvath 对不起,我的语法模棱两可。已经澄清了。
  • 我也在寻找如何做到这一点。使递归函数有效,但是现在,在函数式编程中迭代循环时如何模拟“继续”和“中断”?

标签: python arrays functional-programming language-agnostic


【解决方案1】:

一种很好的方法是结合使用zip 方法和sum

sum(a > b for a, b in zip(array, array[1:]))

【讨论】:

    【解决方案2】:

    我不知道python数组是否有reduce函数,但如果有,你可以做一些在javascript中会这样做的事情:

    let result = 0;
    [1,2,3,4,5,4,3,2,1].reduce((prev,current) => {
        if (prev > current){
            result = result + 1;;
        }
        return current;
    });
    
    console.log(result); // 4 for the given array
    

    【讨论】:

      【解决方案3】:

      这里是递归函数。

      def decreasing(xs):
          if len(xs) < 2:
              return 0
          (x0, x1, *xss) = xs
          if x0 > x1:
              return 1 + decreasing([x1] + xss)
          return decreasing([x1] + xss)
      

      我不确定在 python 中创建多个这样的列表是否健康。

      【讨论】:

        猜你喜欢
        • 2011-03-09
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-04
        相关资源
        最近更新 更多