List 如何使用chez方案获得给定列表中所有元素的总和? (定义列表A(列表1/2/3/4/5/6)) (定义l(长度列表A)) (定义suma)( lambda()( (设s((i0)) (如果(=l 1) (列表参考列表A i) ((如果(

List 如何使用chez方案获得给定列表中所有元素的总和? (定义列表A(列表1/2/3/4/5/6)) (定义l(长度列表A)) (定义suma)( lambda()( (设s((i0)) (如果(=l 1) (列表参考列表A i) ((如果(,list,sum,scheme,List,Sum,Scheme,我在运行(suma)时遇到以下错误: 尝试应用非过程。 我是新手,所以请帮忙。谢谢大家! 添加列表中所有元素的最简单方法是使用apply: (define lista (list 1/2 2/3 3/4 4/5 5/6)) (define l (length lista)) (define suma ( lambda() ( (let s((i 0)) (if (= l 1) (list-ref lista i) (

我在运行(suma)时遇到以下错误:

尝试应用非过程。



我是新手,所以请帮忙。谢谢大家!

添加列表中所有元素的最简单方法是使用
apply

(define lista (list 1/2 2/3 3/4 4/5 5/6))
(define l (length lista))

(define suma (
lambda() (
    (let s((i 0))
        (if (= l 1)
            (list-ref lista i)
            (   (if(< i (- l 2))
                    (+ (list-ref lista i) (s (+ i 1)))      
                )
            )
        )
    )
)   
)
)
但我想你想从头开始实现这个。您的过程有很多括号错误,并且在列表上迭代的方式(使用
list ref
)不是惯用的-在方案中,我们使用递归遍历列表,而不是索引。修复它需要相当多的工作:

(apply + lista)
=> 3 11/20
但是,即使我们使用显式递归来解决这个问题,上面的内容也不是惯用的。更符合Scheme精神的解决方案如下所示,请注意遍历列表的模板:

(define suma
  (lambda ()
    (let s ((i 0))
      (if (= i (- l 1))
          (list-ref lista i)
          (+ (list-ref lista i)
             (s (+ i 1)))))))
或者,我们可以使用编写更高效的解决方案:

(define (suma lst)           ; pass the list as a parameter
  (if (null? lst)            ; is the list empty? then
      0                      ; we've reached the base case, return 0
      (+ (car lst)           ; otherwise add the current element
         (suma (cdr lst))))) ; and advance the recursion
无论哪种方式,我们都将输入列表作为参数传递,并且它按预期工作:

(define (suma lst)
  (let s ((lst lst)              ; list to traverse
          (acc 0))               ; accumulated result
    (if (null? lst)              ; if the list is empty
        acc                      ; return the accumulator
        (s (cdr lst)             ; otherwise advance recursion
           (+ (car lst) acc))))) ; and update accumulator

添加列表中所有元素的最简单方法是使用
apply

(define lista (list 1/2 2/3 3/4 4/5 5/6))
(define l (length lista))

(define suma (
lambda() (
    (let s((i 0))
        (if (= l 1)
            (list-ref lista i)
            (   (if(< i (- l 2))
                    (+ (list-ref lista i) (s (+ i 1)))      
                )
            )
        )
    )
)   
)
)
但我想你想从头开始实现这个。您的过程有很多括号错误,并且在列表上迭代的方式(使用
list ref
)不是惯用的-在方案中,我们使用递归遍历列表,而不是索引。修复它需要相当多的工作:

(apply + lista)
=> 3 11/20
但是,即使我们使用显式递归来解决这个问题,上面的内容也不是惯用的。更符合Scheme精神的解决方案如下所示,请注意遍历列表的模板:

(define suma
  (lambda ()
    (let s ((i 0))
      (if (= i (- l 1))
          (list-ref lista i)
          (+ (list-ref lista i)
             (s (+ i 1)))))))
或者,我们可以使用编写更高效的解决方案:

(define (suma lst)           ; pass the list as a parameter
  (if (null? lst)            ; is the list empty? then
      0                      ; we've reached the base case, return 0
      (+ (car lst)           ; otherwise add the current element
         (suma (cdr lst))))) ; and advance the recursion
无论哪种方式,我们都将输入列表作为参数传递,并且它按预期工作:

(define (suma lst)
  (let s ((lst lst)              ; list to traverse
          (acc 0))               ; accumulated result
    (if (null? lst)              ; if the list is empty
        acc                      ; return the accumulator
        (s (cdr lst)             ; otherwise advance recursion
           (+ (car lst) acc))))) ; and update accumulator

最简单的答案,也是有经验的Scheme程序员无疑会使用的答案是:

(suma lista)
=> 3 11/20
如果需要递归解决方案,可以使用以下方法:

(define (sum xs) (apply + xs))
对于迭代的尾部递归解决方案,您可以使用命名let:

(define (sum xs) (if (null? xs) 0 (+ (car xs) (sum (cdr xs)))))
下面是另一个迭代解决方案,使用do:

(define (sum xs)
  (let loop ((xs xs) (sum 0))
    (if (null? xs) sum
      (loop (cdr xs) (+ sum (car xs))))))
如果您坚持使用列表参考,这里有一个解决方案;它将是此处显示的那些中效率最低的,因为list ref重复遍历列表:

(define (sum xs)
  (do ((xs xs (cdr xs)) (sum 0 (+ sum (car xs))))
      ((null? xs) sum)))

您应该确保了解所有这些解决方案,因为它们表达了各种各样的Scheme习惯用法,您会发现这些习惯用法在未来的编程中非常有用。

最简单的答案,也是有经验的Scheme程序员无疑会使用的答案是:

(suma lista)
=> 3 11/20
如果需要递归解决方案,可以使用以下方法:

(define (sum xs) (apply + xs))
对于迭代的尾部递归解决方案,您可以使用命名let:

(define (sum xs) (if (null? xs) 0 (+ (car xs) (sum (cdr xs)))))
下面是另一个迭代解决方案,使用do:

(define (sum xs)
  (let loop ((xs xs) (sum 0))
    (if (null? xs) sum
      (loop (cdr xs) (+ sum (car xs))))))
如果您坚持使用列表参考,这里有一个解决方案;它将是此处显示的那些中效率最低的,因为list ref重复遍历列表:

(define (sum xs)
  (do ((xs xs (cdr xs)) (sum 0 (+ sum (car xs))))
      ((null? xs) sum)))

您应该确保了解所有这些解决方案,因为它们表达了各种各样的Scheme习惯用法,您会发现这些习惯用法在未来的编程中非常有用。

如果您想要一本好的(免费在线)教科书来解决所有问题,请看一看如何设计程序(www.htdp.org)。这不是一本快速阅读的书,但它会让你成为一个更好的程序员,它会告诉你如何解决你在这里遇到的所有问题。如果你想要一本好的(免费在线)教科书来解决你的所有问题,看看如何设计程序(www.htdp.org)。这不是一本快速阅读的书,但它会让你成为一个更好的程序员,它会告诉你如何解决你在这里遇到的所有问题。谢谢!非常详细和容易理解。我不希望有更好的答案。@Slim\u Shady不客气!这一直是我的荣幸:)谢谢!非常详细和容易理解。我不希望有更好的答案。@Slim\u Shady不客气!这一直是我的荣幸:)非常感谢!我会尽力理解这一切。我之所以没有选择你的答案作为被接受的答案,是因为奥斯卡·洛佩斯先回答了。非常感谢!我会尽力理解这一切。我之所以没有选择你的答案作为被接受的答案,是因为奥斯卡·洛佩斯先回答了。