Haskell 学习笔记-03:函数式编程与量子计算

鸡兔同笼

已知鸡和兔的总数量为 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]

猜你喜欢

转载自blog.csdn.net/quicmous/article/details/80638213