List 如何使用chez方案获得给定列表中所有元素的总和? (定义列表A(列表1/2/3/4/5/6)) (定义l(长度列表A)) (定义suma)( lambda()( (设s((i0)) (如果(=l 1) (列表参考列表A i) ((如果(
我在运行(suma)时遇到以下错误: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) (
尝试应用非过程。
我是新手,所以请帮忙。谢谢大家! 添加列表中所有元素的最简单方法是使用
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不客气!这一直是我的荣幸:)非常感谢!我会尽力理解这一切。我之所以没有选择你的答案作为被接受的答案,是因为奥斯卡·洛佩斯先回答了。非常感谢!我会尽力理解这一切。我之所以没有选择你的答案作为被接受的答案,是因为奥斯卡·洛佩斯先回答了。