递归笛卡尔积函数球拍 [英] Recursive Cartesian Product Function Racket

查看:0
本文介绍了递归笛卡尔积函数球拍的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试实现一个递归函数来查找两个集合的笛卡尔乘积。我目前拥有的代码如下:

    (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)))]))))

然而,我的逻辑中有一些错误,我还不能准确地指出。如有任何帮助,我们将不胜感激!

推荐答案

有两个循环而不是一个循环怎么样?

(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函数,该函数将循环访问一个集合的所有元素以及另一个集合的第一个元素,您的问题将不复存在。

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))
'()

或者,更像球拍的东西:

(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)))))

这篇关于递归笛卡尔积函数球拍的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆