鸡兔同笼
已知鸡和兔的总数量为 n, 总腿数为 m。 输入 n 和 m, 依次输出鸡的数目和兔的数目。 如果无解, 则输出 No answer。
此问题 C 语言代码如下:
#include< stdio. h>
int main() {
int a, b, n, m;
scanf("% d% d", &n, &m);
a = (4 * n - m)/ 2;
b = n- a;
if( m % 2 == 1 || a < 0 || b < 0)
printf(" No answer\ n");
else
printf("% d %d\ n", a, b);
return 0;
}
列表推导式,是否更适合量子计算?
Haskell 提供了另外一种解决此问题的途径,代码如下:
q m n = [(a,b)|a <- [0.. 100], b <- [0.. 100], a + b == m, 2*a + 4*b == n]
试验一下:
>> q 14 32
(12,2)
我靠,这也太强大了吧,Haskell 竟然自己会解方程组。 我把a、b取值范围限制在了100以内,函数可以很快求解。
我尝试着扩大取值范围,把 100 改成了 10000,结果计算了好久才出结果。可见,所谓的列表推导技术,应该是基于暴力穷举的方法搞定的,非常耗费计算机时间。列表推导式的工作原理应该是一个多重循环,内置条件判断。
我猜这种方法用量子计算机很容易给出计算结果,这个计算原理应该是符合量子计算模型的,是不是的确如此,我不好下结论,好在量子计算技术很快就要进入上用领域了,咱们试目以待吧、
实际上,函数式编程的模式匹配模式,我觉得借助量子计算技术可以做得更强大一些,这个以后结合具体问题咱们慢慢唠。
模仿 C 语言
也可以模仿 C 语言代码提供一个效率很高的函数实现:
qc m n =
let
b = (n - 2*m) `div` 2
a = m - b
in
if (a >= 0) && (b >= 0) && (a + b == m) && (2*a + 4*b == n) then [(a,b)]
else [(a,b)]
高效率的“纯函数式”编程
如果采用函数式编程思想,也可以提升效率,因此,函数式编程也要讲究策略:
qh m n = [(a,b)|a <- [0.. m], b <- [m-a], 2*a + 4*b == n]
更甚者,给出下面的代码,运行效率和 C 没有质的区别:
qh2 m n = [(a,b)|b <- [(n - 2*m) `div` 2], a <- [m-b], 2*a + 4*b == n]