从许多参数中找出最小参数

时间:2014-09-15 22:42:00

标签: scheme minimum

假设我们有一组值,如果我们将值作为参数传递给函数,以便函数调用看起来像这样。

(define (function arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8)
    ;; Return minimum argument
    )

如果不使用列表或内置的min函数,并使用最小数量的比较找到最小的参数,你会怎样?如果不使用列表或使用大量(在我看来)所有参数之间的比较,我无法确定一种方法。 Scheme是否有一些除min或某些语法之外的方法来有效地找到最小值。

2 个答案:

答案 0 :(得分:4)

你知道这两个参数min是如何实现的,所以为什么不在本地实现它,然后编写基于列表的方法所具有的扩展。那就是:

(define (min x1 x2 x3 x4 x4 x5 x6 x7 x8)
  (define (min2 a b)
    (if (< a b) a b))
  (min2 x1 (min2 x2 (min2 x3 (min2 x4 (min2 x5 (min2 x6 (min2 x7 x8))))))))

这是什么方法最终将归结为什么。如malisper correctly points out,您需要进行七次比较。

如果您愿意,可以重新排序比较并减少嵌套调用的一些堆栈空间:

(define (min x1 x2 x3 x4 x4 x5 x6 x7 x8)
  (define (min2 a b)
    (if (< a b) a b))
  (min2 (min2 (min2 x1 x2) (min2 x3 x4))
        (min2 (min2 x5 x6) (min2 x7 x8))))
但是,这仍然是七次比较。此时,虽然您实际上只是在考虑编写相同代码的不同方式,但在这种情况下,您应该查看Another way of writing a mimum value procedure in Scheme?

答案 1 :(得分:3)

这些方面的东西应该有效。通常情况下,我会循环遍历参数并跟踪到目前为止看到的最小值,但由于参数是分开进行的,因此这是下一个最好的事情。

(define (function arg1 ... arg8)
  (let* ((best2 (if (< arg1 arg2) arg1 arg2))
         (best3 (if (< best2 arg3) best2 arg3))
         ...
         (best7 (if (< best6 arg7) best6 arg7)))
    (if (< best7 arg8)
        best7
        arg8)))

这总共使用了七次比较,我非常确定这是最佳的。