将列表作为参数函数传递?

ken*_*ger 3 scheme

我试图在方案中创建一个简单的函数,找到列表中的最大数字.

这是我的代码:

(define (maximo lista maximo_actual)
    (if (= lista ())
        maximo_actual
        (let* ((primero maximo_actual)
               (segundo (car lista)))
          (if (> primero segundo)
              ((maximo (cdr lista) primero))
              ((maximo (cdr lista) segundo))))))
Run Code Online (Sandbox Code Playgroud)

我用这个调用函数:

(maximo (list 6 3 2 8 9) 5)
Run Code Online (Sandbox Code Playgroud)

程序返回:

;ERROR: "programas.scm": =: Wrong type in arg1 (6 3 2 8 9)
; in expression: (#@= #@lista ())
; in scope:
;   (lista maximo_actual)  procedure maximo
; defined by load: "programas.scm"
Run Code Online (Sandbox Code Playgroud)

我认为参数有问题.我正在学习计划,我不知道问题出在哪里.

Jak*_*lsh 5

我的awnser基于Racket(基于方案)

您的计划存在一些问题.一,=比较数字,而不是列表.其次()是一个没有任何内容的函数,而不是列表.要创建一个空列表,请使用(list)'().最后,((maximo (cdr lista) primero))有一组额外的括号,它会导致(maximo (cdr lista) primero)执行结果.但是,结果(maximo (cdr lista) primero)是一个数字.

我想你想要这样的东西,它会9在调用时返回(maximo (list 6 3 2 8 9) 5)

(define (maximo lista maximo_actual)
    (if (empty? lista)
        maximo_actual
        (let* ((primero maximo_actual)
                (segundo (car lista)))
            (if ( > primero segundo)
                (maximo (cdr lista) primero)
                (maximo (cdr lista) segundo)))))
Run Code Online (Sandbox Code Playgroud)

你也可以用折叠来写它,它稍微短一点:

(define (maxio2 current result)
  (if (> current result)
      current
      result))

(foldl maxio2 5 (list 6 3 2 8 9))
Run Code Online (Sandbox Code Playgroud)