Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何对结构列表中的数字求和?(球拍)_List_Struct_Functional Programming_Scheme_Racket - Fatal编程技术网

List 如何对结构列表中的数字求和?(球拍)

List 如何对结构列表中的数字求和?(球拍),list,struct,functional-programming,scheme,racket,List,Struct,Functional Programming,Scheme,Racket,我试图使用递归函数对结构列表中的所有整数求和,但我一辈子都搞不懂 (struct number (int)) (define ints (list (number 1) (number 2) (number 3))) (define sum (λ (number) (cond ((null? number) 0) ; Base Case (

我试图使用递归函数对结构列表中的所有整数求和,但我一辈子都搞不懂

(struct number (int))
(define ints (list (number 1)
                   (number 2)
                   (number 3)))

(define sum (λ (number)
            (cond
              ((null? number) 0) ; Base Case
              (#t (+ (number-int (car ints)) ; Take the first of the list
                     (sum (cdr ints))))))) ; Rest the list
我花了几个小时尝试了以下不同的版本:

(cdr ints),即最后一行的(数字int(cdr ints))

我相信正是这一点导致了这个问题(包括
(cdr ints)
(number int(cdr ints))
”(##)的形式返回一些东西
。但似乎什么都不起作用

是否有以整数列表的形式返回列表的cdr而不是
'(##)的过程

任何帮助都将不胜感激。

试试以下方法:

(define sum 
  (λ (lst)
    (cond ((null? lst) 0)
          (else (+ (number-int (car lst))
                   (sum (cdr lst)))))))
一些评论:

  • 对于
    cond
    表达式中的最后一个条件,使用
    else
    而不是
    #t
  • 您将过程参数
    number
    的名称与您在外部定义的
    ints
    列表的名称混合在一起
  • 最好将其重命名为
    lst
    ,或者其他可以清楚显示您正在处理的列表的名称
现在它如预期的那样工作:

(sum ints)
=> 6

可以使用带有存储和值的变量的递归命名let:

(define (sum lst)
  (let loop ((lst lst)
             (s 0))
    (if (empty? lst)
        s
        (loop (cdr lst)
              (+ s
                 (number-int (car lst)))))))
“ints”的名称非常糟糕;表明它是一个int列表,但它是一个“数字”列表(即结构);因此更好的名称可以是
数字
。然后,定义
总和数字
函数,称为
(总和数字)
,或
总和数字
,称为
(总和数字)
。第一个需要
数字
,即
数字
结构列表;第二个需要int列表,因此我们必须将“number”结构列表转换为int数字列表(使用
映射
)。