0

这是我最后一道作业题,也难倒了导师。老实说,我不知道该去哪里,并且在学校已经用尽了帮助。我要问的问题:

定义一个过程 test-most-common,它需要一个数字重复、一个数字率以及一个原始的 0 和 1 列表。该程序应首先生成列表原件的重复副本。然后它应该通过平均每个速率元素引入随机误差来模拟每个副本在噪声信道上的传输。最后,它应该检查最常见的值列表是否与原始输入列表匹配。

我已经准备好编写一个包含最常见元素的函数(非常感谢 Oscar 的那个!)所以我真的需要一些帮助来解决这个问题。我知道您想使用随机数并为该随机数设置特定的费率。如果发生错误,我知道您想将 0 更改为 1,将 1 更改为 0。我还准备好编写一个函数,该函数将以给定的重复次数重复原始函数,这就是我到目前为止所拥有的这个问题在这里给出:

(define repeated-list 
 (lambda (rep org)
  (cond
   [(equal? rep 0) '()]
   [else (cons org (repeated-list (sub1 rep) org))])))

(define noisy-channel
 (lambda (rep-org rate)
  (cond
   [(null? rep-org) '()]
   [else (cons (noisy-helper (car rep-org) rate) (noisy-channel (cdr rep-org) 
    rate))])))


(define noisy-helper
 (lambda (rep-org rate)
  (cond
    [(null? rep-org) '()]
     [**(here is where I'm stuck)**])))


(define test-most-common
 (lambda (rep rate org)
  (equal? (most-common(noisy-channel (repeated-list rep org) rate)) org)))

我标记了我卡住的地方。正是在那一点上,我相信我需要做随机函数和一些数学运算(也许?)才能得到实际翻转位的位置。

4

2 回答 2

0

首先,您的重复组织的行为与您描述的不同。它重复单个元素,而不是列表。您实际上需要一个辅助函数来制作重复列表,或者使用 append 函数:

(define repeated-list 
  (lambda (rep org)
    (cond
      [(equal? rep 0) '()]
      [else (append org (repeated-list (sub1 rep) org))])))

其次,如果要编写一个以一定概率发生变化的函数:

(define change-list
  (lambda (mypoorlist rate)
    (cond
      [(empty? mypoorlist) '()]
      ;; if rate exceeds a random value from 0..1
      ;; then toggle the first value (1 - first value)
      [(> rate (random)) (cons (- 1 (car mypoorlist)) (change-list (cdr mypoorlist) rate))]
      ;; otherwise just keep going
      [else (cons (car mypoorlist) (change-list (cdr mypoorlist) rate))]
     )))

对于最常见的情况,只需编写一个函数以递归方式查找。如果您正在处理 0/1 列表,一种简单的方法就是添加整个内容,看看它是大于还是小于 length/2。

不过,您的问题很奇怪,如果您随机更改值,则不能保证最常见的元素不会改变。如果你有足够高的比率(超过 50%),它甚至变得不太可能。

也许如果您发布确切的问题,我们可以为您提供更多帮助。

于 2013-10-03T19:15:47.017 回答
0

万一有人对此感到好奇,我解决了这个问题,并将在我的作业中展示我如何提交它的代码。我因为没有在最终函数中进行递归而搞砸了,以便它检查每个嵌套列表,但这是一个简单的修复。

(define repeated-list 
 (lambda (rep org)
  (cond
   [(equal? rep 0) '()]
   [else (cons org (repeated-list (sub1 rep) org))])))

(define noisy-helper
 (lambda (rep-org rate)
  (cond
      [(null? rep-org) '()]
      [(< (random 100) rate)
       (cond
         [(equal? (car rep-org) 0) (cons 1 (noisy-helper (cdr rep-org) rate)
                                         )]
         [(equal? (car rep-org) 1) (cons 0 (noisy-helper (cdr rep-org) rate)
                                         )])]
      [else (cons (car rep-org) (noisy-helper (cdr rep-org) rate))])))


(define noisy-channel
 (lambda (rep-org rate)
   (cond
    [(null? rep-org) '()]
    [else (cons (noisy-helper (car rep-org) rate) (noisy-channel (cdr rep-org)
                                                               rate))])))

(define test-most-common
 (lambda (rep rate org)
   (equal? (most-common org)(most-common(car (noisy-channel 
                                           (repeated-list rep org) 
                                           rate))))))
于 2013-10-04T03:34:32.727 回答