Functional programming 在DrRacket(或Scheme)中使用此格式生成树

Functional programming 在DrRacket(或Scheme)中使用此格式生成树,functional-programming,scheme,binary-tree,racket,Functional Programming,Scheme,Binary Tree,Racket,因此,我使用DrRacket并将结构定义为: (define-struct thing (a b)) 然后,我有一个这种格式的示例树: (define v (make-thing (make-thing (make-thing 1 2) (make-thing 3 4)) (make-thing (make-thing 5 6)

因此,我使用DrRacket并将结构定义为:

(define-struct thing (a b))
然后,我有一个这种格式的示例树:

(define v (make-thing 
              (make-thing (make-thing 1 2) 
                          (make-thing 3 4))  
              (make-thing (make-thing 5 6) 
                          (make-thing 7 8))))
我需要构建一个函数,它接受一个非正数,也是2的幂(比如1,2,4,8,16…),或者输出数字1(如果n=1),或者按照上面的格式生成一个“东西”

到目前为止,我已经尝试了很多方法,但我要么最终得到如下结果:

(make-thing (make-thing (make-thing 1 1) 
                        (make-thing 1 1)) 
            (make-thing (make-thing 1 1) 
                        (make-thing 1 1))))
我不知道如何正确增加变量-我已经知道如何应用所需数量的
make thing
s:

下面是我现在使用的代码:

(define (helper pow current)
  (cond
    ((= pow 0) 1)
    (else (make-thing 
             (helper (- pow 1) current) 
             (helper (- pow 1) (- current 1))))))

(define current 1)

(define (build-thing-or-number n)
  (cond
    ((= n 1) 1)
    (else (make-thing 
             (helper (- (log n 2) 1) current) 
             (helper (- (log n 2) 1) (add1 current))))))
为了便于验证,我将其定义为透明

(define (helper level max)
  (if (equal? (/ level 2) 1)
      (make-thing (- max 1) max)
      (make-thing (helper (/ level 2) (- max (/ level 2))) (helper (/ level 2) max))))
max等于当前事物中的最大值 级别是相同形状的最简单(读取最低值)对象中的最高数字(即(对象(对象5 6)(对象7 8))的最大值为8,级别为4)


正如您所看到的,helper完成了所有的工作。

请允许我调用您的
构建对象或号码
只需
g
,这样我就可以少打字了

所以你想要

(g1)=1;你已经准备好了
(g2)=(事物12)
(g4)=(事物(事物12)(事物34))
(g8)=(事物(事物12)(事物34));1..4
(事(事5 6)(事7 8));5..8
我们看到,如果我们有更多的参数,这将更容易做到:

(定义(h a b);从…到
(续)
(=(+A1)b);类似于(H12):
把东西做成;把东西做成
(其他;例如:(H14)(H58)
(let([c(/(+ab-1)2)];c=2c=6
(制造东西;c是中间的
(h a c);使前半部分为1..2 1..4
(h)(""""""");;第二个3..4 5..8
我们只是把它当作

(定义(g b)
(cond(=b1)1)
(其他(h…))

就这样

与透明的接触很好。
(define (helper level max)
  (if (equal? (/ level 2) 1)
      (make-thing (- max 1) max)
      (make-thing (helper (/ level 2) (- max (/ level 2))) (helper (/ level 2) max))))
(define (build-thing-or-number n)
  (cond
    ((= n 1) 1)
    (else (helper n n))))