From Newsgroup: comp.lang.scheme
andrew.baine wrote:
I'm looping over two variables to maximize a function, returning x and
y that maximize f. Any way to do it without the setf in the body?
; Here's a function you can paste to the REPL.
(defun f (x y)
(- (+ (* 9 x) (* 4 y))
(* x x)
(* y y))
A parenthesis is missing.
; And here's what I'm trying to do:
(let ((best-x -1)
(best-y -1)
(max nil))
(loop :for x :below 10 :do
(loop :for y :below 10 :do
(let ((n (f x
y)))
(if (or (null max) (> n
max))
(setf best-x
x
best-y
y
max n)))))
(values best-x best-y))
Gauche Scheme
(use util.combinations) ;; cartesian-product
(use gauche.collection) ;; find-max
(define (f x y)
(- (+ (* 9 x) (* 4 y))
(* x x)
(* y y)))
(find-max
(cartesian-product (list (iota 10) (iota 10)))
:key (cut apply f <>))
===>
(5 2)
Another solution: (4 2)
--- Synchronet 3.21a-Linux NewsLink 1.2