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]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Haskell函数式编程基础是一本关于Haskell编程语言的基础教程。Haskell是一种纯函数式编程语言,具有强大的类型系统和丰富的函数组合能力。这本PDF书籍主要介绍了Haskell的基本语法、函数定义和应用、递归和高阶函数等概念和技巧。 首先,该书从Haskell的基本语法开始介绍,包括如何定义变量、函数和类型。作者通过简单的示例代码演示了Haskell的函数式特性,帮助读者理解和掌握函数式编程的基本概念。 然后,该书详细介绍了Haskell的函数定义和应用。读者将学习如何定义函数,包括函数的参数和返回值。同时,该书还介绍了函数的局部定义和模式匹配等技巧,这些技巧可以帮助读者更好地组织和重用代码。 接着,该书介绍了Haskell中的递归和高阶函数。递归是函数式编程中一种重要的循环结构,该书通过具体的例子演示了如何使用递归实现一些常见的算法和问题。另外,高阶函数是Haskell的特色之一,该书详细介绍了如何使用高阶函数来简化和抽象代码。 最后,该书还介绍了Haskell的类型系统和类型推导。Haskell是一种静态类型语言,具有强大的类型推导能力,可以帮助程序员在编写代码时避免一些常见的错误。该书通过一些实例详细讲解了Haskell的类型系统,帮助读者理解并正确使用类型。 总之,Haskell函数式编程基础是一本系统而详细的Haskell教程,适合有一定编程基础的读者学习和实践。通过阅读并练习该书中的例子,读者可以逐步掌握Haskell的基本概念和技巧,并能够编写和理解复杂的函数式代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许野平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值