包含对的列表中的元素相乘

肖恩

我正在尝试使用Scheme编写代码(函数):

  • 将任意大小的列表作为参数
  • 将列表中的每个数字相乘
  • 符号应跳过
  • 对内的值应包含在乘法中

换句话说,结果应如下所示:

> (mult '(1 2 3))
6
> (mult '(1 2 x 3 4))
24
> (mult '(1 2 z (3 y 4)))
24 (mine gives me 2)

我的代码允许我跳过符号并乘以所有内容。但是,一旦我在列表中加入了一对,它就好像不是一个数字,因此就好像它不存在一样。这是我的代码:

(define mult
       (lambda (x)
               (if (null? x)
                      1
                      (if(number? (car x))
                         (* (car x) (mult (cdr x)))
                         (mult(cdr x))))))

我曾尝试在发现一对时使用append,但是显然我做错了……我将非常感谢您提供有关如何将其包含在一对内的值的任何帮助。

和e'(1 2 y(3 of 4)= 1 * 2 * 3 * 4

乌塞尔帕

您快到这里了,只是错过了清单?测试:

(define (mult lst)
  (if (null? lst) 
      1
      (let ((ca (car lst)))
        (cond
          ((number? ca) (* ca (mult (cdr lst))))
          ((list? ca)   (* (mult ca) (mult (cdr lst))))
          (else         (mult (cdr lst)))))))

编辑

他是不让的等效版本:

(define (mult lst)
  (cond
    ((null? lst)         1)
    ((number? (car lst)) (* (car lst) (mult (cdr lst))))
    ((cons? (car lst))   (* (mult (car lst)) (mult (cdr lst))))
    (else                (mult (cdr lst)))))

如您所见,(car lst)可能会被多次评估,因此我在第一个版本中使用let来避免这种情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章