假设我们有一组值,如果我们将值作为参数传递给函数,以便函数调用看起来像这样。
(define (function arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8)
;; Return minimum argument
)
如果不使用列表或内置的min函数,并使用最小数量的比较找到最小的参数,你会怎样?如果不使用列表或使用大量(在我看来)所有参数之间的比较,我无法确定一种方法。 Scheme是否有一些除min或某些语法之外的方法来有效地找到最小值。
答案 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)))
这总共使用了七次比较,我非常确定这是最佳的。