Tree Lisp抛硬币头序列

Tree Lisp抛硬币头序列,tree,count,lisp,Tree,Count,Lisp,在Lisp中,我必须创建一个执行以下操作的程序(请访问链接): 我有创建树的代码 (defun head-tail (n &optional (total 0)) (if (< total n) (list(cons 'H (head-tail n (1+ total))) (cons 'T (head-tail n (1+ total)))) nil)) 代码不能处理大量的树,任何帮助都会很好 有两个问题: 在函数head-

在Lisp中,我必须创建一个执行以下操作的程序(请访问链接):

我有创建树的代码

(defun head-tail (n  &optional (total 0))
  (if (< total n)
      (list(cons 'H (head-tail n (1+ total)))
             (cons 'T (head-tail n (1+ total))))
    nil))

代码不能处理大量的树,任何帮助都会很好

有两个问题:

  • 在函数
    head-search2
    中,
    cond
    的第二个子句中,对
    head-search2
    的第一次递归调用无法向下传播
    检查

  • 同一子句,第二个递归调用获取
    (rest-tree)
    作为第一个参数,这将产生一个额外的列表层;它应该是
    (第二棵树)

  • 这就是说,您将遍历树两次:首先在构建时遍历,然后对其进行计数。如果再仔细考虑一下,只需遍历一次即可节省大量工作,而无需显式构造它:

    (defun count-n-runs (m n &optional (k n))
      "Count all possible binary sequences with n consecutive 1s."
      (cond ((= 0 n) (expt 2 m))
            ((= 0 m) 0)
            ((+ (count-n-runs (1- m) k k)
                (count-n-runs (1- m) (1- n) k)))))
    

    为动态编程进一步重写此代码,留给读者作为练习。;)

    有两个问题:

  • 在函数
    head-search2
    中,
    cond
    的第二个子句中,对
    head-search2
    的第一次递归调用无法向下传播
    检查

  • 同一子句,第二个递归调用获取
    (rest-tree)
    作为第一个参数,这将产生一个额外的列表层;它应该是
    (第二棵树)

  • 这就是说,您将遍历树两次:首先在构建时遍历,然后对其进行计数。如果再仔细考虑一下,只需遍历一次即可节省大量工作,而无需显式构造它:

    (defun count-n-runs (m n &optional (k n))
      "Count all possible binary sequences with n consecutive 1s."
      (cond ((= 0 n) (expt 2 m))
            ((= 0 m) 0)
            ((+ (count-n-runs (1- m) k k)
                (count-n-runs (1- m) (1- n) k)))))
    

    为动态编程进一步重写此代码,留给读者作为练习。;)

    “不能处理大量的树”是什么意思?比如当我用它来处理一棵3的树,寻找2的序列时,它有一个正确的结果,但是对于一棵树=4,序列=2不起作用,它输出7,当它应该输出8,树=6,n=2时,它给出了31的读数43@zmccord您所指向的网页不清楚。实际上,您并不是在执行抛硬币实验(比如使用伪随机数生成器)。您正在处理所有的
    (expt 2 n)
    可能的正反面组合,并寻找H序列。这纯粹是一个组合问题,类似于:哇,许多从0到2^n的n位二进制数包含至少K个零位的连续序列。对吗?我正在创建一个包含所有可能序列的树。然后读一读,看看一行中出现了多少个Hs。是的,我没有掷硬币为什么这是个问题?链接才是真正的问题。我不明白你在说什么。。这就是问题所在不要试图改变它@Kaz“不能处理大量的树”是什么意思?比如当我用它来处理一棵3的树,寻找2的序列时,它有一个正确的结果,但是对于一棵树=4,序列=2不起作用,当它应该输出8,树=6时,它输出7,n=2给出了31的43@zmccord您所指向的网页不清楚。实际上,您并不是在执行抛硬币实验(比如使用伪随机数生成器)。您正在处理所有的
    (expt 2 n)
    可能的正反面组合,并寻找H序列。这纯粹是一个组合问题,类似于:哇,许多从0到2^n的n位二进制数包含至少K个零位的连续序列。对吗?我正在创建一个包含所有可能序列的树。然后读一读,看看一行中出现了多少个Hs。是的,我没有掷硬币为什么这是个问题?链接才是真正的问题。我不明白你在说什么。。这就是问题所在不要试图改变它@卡兹
    (defun count-n-runs (m n &optional (k n))
      "Count all possible binary sequences with n consecutive 1s."
      (cond ((= 0 n) (expt 2 m))
            ((= 0 m) 0)
            ((+ (count-n-runs (1- m) k k)
                (count-n-runs (1- m) (1- n) k)))))