ai didi

list - 以 "overlapped"的方式向列表添加值

转载 作者:行者123 更新时间:2023-12-01 05:12:07 24 4
gpt4 key购买 nike

我将用数学解释,这是我正在努力为以下内容编写 Scheme 代码的转换:

(f '(a b c) '(d e f)) = '(ad (+ bd ae) (+ cd be af) (+ ce bf) cf)

两个字母在一起的地方像 ad意味着 (* a d) .

我试图以纯粹的功能方式编写它,但我正在努力了解如何。任何建议将不胜感激。

这里有些例子:
(1mul '(0 1) '(0 1)) = '(0 0 1)
(1mul '(1 2 3) '(1 1)) = '(1 3 5 3)
(1mul '(1 2 3) '(1 2)) = '(1 4 7 6)
(1mul '(1 2 3) '(2 1)) = '(2 5 8 3)
(1mul '(1 2 3) '(2 2)) = '(2 6 10 6)
(1mul '(5 5 5) '(1 1)) = '(5 10 10 5)
(1mul '(0 0 1) '(2 5)) = '(0 0 2 5)
(1mul '(1 1 2 3) '(2 5)) = '(2 7 9 16 15)

所以,模式就像我在开始时发布的:

将列表中的第一个数字乘以第二个列表中的每个数字 (ad, ae, af) 然后继续 (bd, be, bf, cd, ce, cf) 并“以某种方式”排列数字以添加相应的值。我称之为重叠的原因是因为你可以像这样想象它:
(list
aa'
(+ ba' ab')
(+ ca' bb' ac')
(+ cb' bc')
cc')

再次,
(f '(a b c) '(d e f)) = '(ad (+ bd ae) (+ cd be af) (+ ce bf) cf)

但是,不仅适用于 3x3 列表,还适用于任何大小的列表。

最佳答案

这是我的代码。它在 Racket 中

#lang racket

(define (drop n xs)
(cond [(<= n 0) xs]
[(empty? xs) '()]
[else (drop (sub1 n) (rest xs))]))

(define (take n xs)
(cond [(<= n 0) '()]
[(empty? xs) '()]
[else (cons (first xs) (take (sub1 n) (rest xs)))]))


(define (mult as bs)
(define (*- a b)
(list '* a b))
(define degree (length as))
(append
(for/list ([i (in-range 1 (+ 1 degree))])
(cons '+ (map *- (take i as) (reverse (take i bs)))))
(for/list ([i (in-range 1 degree)])
(cons '+ (map *- (drop i as) (reverse (drop i bs)))))))
for/list s 只是映射数字列表并将结果收集在列表中的方法。如果你需要,我可以重新制定它只是 map 。

关于list - 以 "overlapped"的方式向列表添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14472831/

24 4 0
文章推荐: Python程序从文本文件中提取文本?
文章推荐: Python从sourceforge获取文件
文章推荐: python - 并行化 IO 密集型 for 循环 : stupid idea?
文章推荐: grails - grails 中的大量 http session
行者123
个人简介

我是一名优秀的程序员,十分优秀!

滴滴打车优惠券免费领取
滴滴打车优惠券
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com