如何查找序列是否在增加?

时间:2012-11-13 02:08:48

标签: functional-programming scheme

这是一项更大任务的一部分,但我真的很挣扎。 scheme / lisp的资源比C,Java和Python更有限。

如果我传入包含数字列表的var list1,如何判断列表是否按单调递增顺序?

3 个答案:

答案 0 :(得分:3)

如果列表中的元素少于两个,那么我们会说“是”。

如果列表中有两个或更多元素,那么如果第一个元素大于第二个元素,我们会说'不',否则在列表的尾部递归。

答案 1 :(得分:1)

(define (monotonically-increasing? lst)
  (apply < lst))

或者,如果你想要单调不减少:

(define (monotonically-non-decreasing? lst)
  (apply <= lst))

是的,它真的很简单。完全为O(n),无需手动递归。

奖金:为了更好的衡量标准:

(define (sum lst)
  (apply + lst))

: - P

答案 2 :(得分:0)

如果效率不是问题,您可以这样做:

(equal? list1 (sort list1 <=))

由于排序,这是一个O(n log n)解决方案。对于最佳解决方案,只需将每个元素与下一个元素进行比较,并测试当前元素是否小于或等于下一个元素,小心最后一个元素(没有下一个元素)。这将产生O(n)解决方案。

这是以功能风格编写的需要完成的一般概念。仍然不是编写解决方案的最快方式,但至少它是O(n)并且非常短;您可以将它作为从头开始编写更简单解决方案的基础:

(define (increasing? lst)
  (andmap <=
          lst
          (append (cdr lst) '(+inf.0))))

以上检查lst中的每个数字是否小于或等于下一个数字。 andmap过程测试<=条件是否适用于两个列表中的所有元素对。第一个列表是作为参数传递的列表,第二个列表是相同的列表,但是向右移动了一个位置,在末尾添加了正无限值以在两个列表中保留相同的大小 - 它适用于最后一个因为任何数字都小于无穷大。例如,使用此列表:

(increasing? '(1 2 3))

上述过程调用将检查(<= 1 2)(<= 2 3)以及(<= 3 +inf.0),因为所有条件评估为#t整个过程返回#t。如果其中一个条件失败,则整个过程将返回#f

相关问题