Tree Lisp抛硬币头序列
在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-
(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)))))