首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归笛卡尔乘积函数拍

递归笛卡尔乘积函数拍
EN

Stack Overflow用户
提问于 2015-02-17 09:03:08
回答 1查看 2K关注 0票数 1

我试图实现一个递归函数来找到两个集合的笛卡儿乘积。我目前的代码如下:

代码语言:javascript
运行
复制
    (define (cartesian-product set-1 set-2)
        (let (b (set 2))
             (cond [(empty? set-1) '()]
                   [(empty? set-2)  (cartesian-product (rest set-1) b)] 
                   [else (append (list (list (first set-1) (first set-2))) (cartesian product set-1 (rest set-2)))]))))

然而,我的逻辑有一些错误,我无法精确地指出。任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-17 19:26:53

用两个循环代替一个循环怎么样?

代码语言:javascript
运行
复制
(define (cartesian-product set-1 set-2)
  (define (cartesian-product-helper element set)
    (if (empty? set)
        set
        (cons (list element (first set))
              (cartesian-product-helper element (rest set)))))
  (if (or (empty? set-1)
          (empty? set-2))
      empty
      (cons (cartesian-product-helper (first set-1) set-2)
            (cartesian-product (rest set-1) set-2))))

您在逻辑中发现了这个问题,并试图将set-2 (您输入为(set 2))保存在b中,但是这个值将在每次递归调用中被覆盖。如果您调用helper函数,它循环遍历一个集合的所有元素和另一个集合的第一个元素,那么您的问题就没有了。

代码语言:javascript
运行
复制
Welcome to DrRacket, version 6.1.1 [3m].
Language: racket; memory limit: 128 MB.
> (cartesian-product '(1 2 3) '(x y z))
'(((1 x) (1 y) (1 z))
  ((2 x) (2 y) (2 z))
  ((3 x) (3 y) (3 z)))
> (cartesian-product '(1 2 3) '())
'()
> (cartesian-product '() '(x y z))
'()

或者,一些更像拍子的东西:

代码语言:javascript
运行
复制
(define (cartesian-product set-1 set-2)
  (if (or (empty? set-1)
          (empty? set-2))
      empty
      (for/list ([i set-1])
        (for/list ([j set-2])
          (list i j)))))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28558134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档