如何在方案中更改列表中的绝对值

Posted

技术标签:

【中文标题】如何在方案中更改列表中的绝对值【英文标题】:How to change absolute values in list in scheme 【发布时间】:2022-01-08 21:54:39 【问题描述】:

我试图将列表中的负值更改为正值。 但是我的代码有一些问题。 :/ 请帮我。 这是我的代码

(define (myabs list) 
(cond
((null? list) '())
(cons((abs (car list))(myabs (cdr list))))
))
(display (myabs '(-3 5 6 -2)))

但结果如下:

  0  (myabs (cdr list))
    At line 4 of "./main.sc"


 1  (myabs (cdr list))
    At line 4 of "./main.sc"


 2  (myabs (cdr list))
    At line 4 of "./main.sc"


 3  (myabs '(-3 5 6 -2))
    At line 8 of "./main.sc"

图片如下:

这是在线方案编译的结果

【问题讨论】:

【参考方案1】:

我同意 Oscar Lopez 的回答,这个回答更像是它的附录。将函数abs 应用于列表的更一般的方法是沿列表map 它。因此,我们可以使用提供的map,或者作为练习,我们可以创建一个新版本的map

; syntax (fk-map function list)

(define (fk-map f lst)
  (if (null? lst)
      '()
      (cons (f (car lst))
        (fk-map f (cdr lst)))))

; (fk-map abs '(-3 5 6 -2)) => '(3 5 6 2)

新的fk-mapfactorial 函数一样是递归的。函数f 依次应用于第一项,并固定在列表其余部分的fk-map 应用上。当列表用完时,递归终止,(null? lst)

对于编码方案,我推荐 Racket 博士,它提供了一个易于使用的开发系统:

【讨论】:

非常友好的帮助。 :)【参考方案2】:

您忘记了最后一个条件的 else 部分并且括号放错了位置,一个好的 IDE 将帮助您轻松发现此类错误(请正确缩进您的代码!)哦,您不应该 将任何变量命名为“list”,这会与同名的内置过程发生冲突。这应该有效:

(define (myabs lst)
  (cond
    ((null? lst) '())
    (else (cons (abs (car lst))
                (myabs (cdr lst))))))

顺便说一句,在 Scheme 中编写解决方案的惯用方式是组合现有程序,这完全一样,而且更简单:

(define (myabs lst) 
  (map abs lst))

【讨论】:

第二种解决方案肯定更强大,更简单,更容易维护。不久前,我注意到在某人的代码中使用conscdrcar,虽然不一定是错误,但建议使用mapfilterreduce 的更简单的方法。 非常感谢。

以上是关于如何在方案中更改列表中的绝对值的主要内容,如果未能解决你的问题,请参考以下文章

Drupal - 站点转移。更改数据库中的绝对 URL?

查找列表中的最大绝对值

如何获取目录中文件的绝对路径?

如何从 django 视图中的绝对 url 获取相对 url?

如何从 Django QuerySet 中获取绝对图像 URL 列表?

更改相对 div 中绝对按钮的顺序 [关闭]