如何在方案中更改列表中的绝对值
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-map
像factorial
函数一样是递归的。函数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))
【讨论】:
第二种解决方案肯定更强大,更简单,更容易维护。不久前,我注意到在某人的代码中使用cons
、cdr
和car
,虽然不一定是错误,但建议使用map
、filter
或reduce
的更简单的方法。
非常感谢。以上是关于如何在方案中更改列表中的绝对值的主要内容,如果未能解决你的问题,请参考以下文章
如何从 django 视图中的绝对 url 获取相对 url?