首页 > 编程语言 >泛型编程之乘法

泛型编程之乘法

时间:2024-11-19 20:14:51浏览次数:3  
标签:return na 编程 half 泛型 odd def 乘法

埃及乘法

目标

学习泛型编程。了解最古老的算法。从运行结果来看,没有明显变化。乘法已是基本运算,电光火石间就完成了。

泛型编程之乘法泛型乘法验证

奇数odd

公元前两千年的埃及人,已经知道奇数和偶数。它是乘法的关键。在埃及乘法发明之前应该都是累加的。乘以2,加倍的乘法是最好算的。我们把乘数加倍,把被乘数减半,反复这样做,这就是“埃及乘法”,或者叫“俄罗斯农夫算法”。

被乘数和乘数

从叠加变成乘法来看,被乘除就是叠加次数,被叠加的次数。乘数就是被叠加的那个数。之前他们的顺序总容易弄反,或者搞不清。今天是看到出处,原型了。

尾递归函数

文章递归的改造——间隔挑硬币里讲过一些改造递归调用函数的方法。现在讲的乘法是一个更好的例子。尾递归函数是使用与形式参数完全对应的实际参数来进行递归调用,而且只在返回值里进行递归调用。尾递归函数就可以改成迭代的形式。

r + n a r+na r+na

r 是在运算过程中会持续更新的值,用来累计计算好的那部分 n a na na乘积。通过引入变量,得到了尾递归的乘法算法。

def weidigui(r,n,a):
    if odd(n):
        r += a
        if n==1:return r
    n = half(n)
    a += a
    return weidigui(r,n,a)

half(n)是把被乘数减半的方法。

扩展加法链

埃及算法不是总是最好的。当被乘数是15时,可以只加五次就行了。埃及算法的时间复杂度是 log ⁡ 2 15 = 3.9068905956085187 \log_{2}{15}=3.9068905956085187 log2​15=3.9068905956085187,但是要执行的加法次数是六。

def beichengshu15(a):
    b = (a+a)+a
    c = b+b
    return (c+c)+b

什么东西都可以做得再极致。

代码

def odd(n):
    return n&0x1
def half(n):
    return n>>1
def mult_acc(r,n,a):
    while True:
        if odd(n):
            r += a
            if 1==n:return r
        n = half(n)
        a += a
        
def multiply(n,a):
    while not odd(n):
        a += a
        n = half(n)
    if 1==n:return a
    #even(n-1)-->n-1 != 1
    return mult_acc(a,half(n-1),a+1)

标签:return,na,编程,half,泛型,odd,def,乘法
From: https://blog.csdn.net/denghai_csdn/article/details/143842990

相关文章

  • 34. 网络编程
    一、什么网络通信  计算机网络把分布在不同地理区域的计算机与专门的外部设备用通信线路互联成一个规模大、功能强的网络系统,从而使众多的计算机可以方便的互相传递信息、共享硬件、软件、数据信息等资源。网络编程直接或间接地通过网络协议与其它计算机实现数据交换,进行通信。......
  • L1-080 乘法口诀数列
    一、问题描述本题要求你从任意给定的两个1位数字a1​和a2​开始,用乘法口诀生成一个数列{an​},规则为从a1​开始顺次进行,每次将当前数字与后面一个数字相乘,将结果贴在数列末尾。如果结果不是1位数,则其每一位都应成为数列的一项。1.输入格式输入在一行中给出3个......
  • 编程命名规范(网文)
    一个好的变量或函数命名,应该能起到自解释的作用,甚至能减少我们代码的注释。naming-cheatsheet是一个命名备忘录,记录一些常见的规范约定,并提供简单的例子说明。如果能够严格遵守这些规范,相信我们的代码可读性会大大提升,下面就来介绍naming-cheatsheet提供的一些建议。项目地址:......
  • 第 1 章 并发编程线程基础
    目录1.1什么是线程 1.2线程创建与运行 1、继承Thread类方式的实现。2、实现Runnable接口的run方法3、使用FutureTask方式1.3线程通知与等待1.wait()函数2.wait(longtimeout)函数3.wait(longtimeout,intnanos)函数4.notify()函数5.notifyAll()......
  • .net 非阻塞的异步编程 及 线程调度过程
    本文主要分为三个部分:1、语法格式2、线程调度情况3、编程注意事项*阅读提示:鼠标悬停在章节标题上可见文章目录  异步编程(TaskAsynchronousProgramming,TAP),一种编程模式(Task-basedAsynchronousPattern)。TAP是.NET中推荐的异步编程模式,基于 Task 和 Task<TR......
  • C++编程:通过多线程与协程优化阻塞型任务的调度性能
    文章目录0.引言1.多线程VS多线程+协程1.1示例1:使用传统的多线程进行矩阵乘法1.2.示例2:使用协程优化阻塞型任务3.分析与对比0.引言我们知道:多线程:适用于处理计算密集型任务或IO操作较少的场景,但会因为线程切换和创建销毁的开销而影响性能。协程:适用于处......
  • 从0开始学习Linux——Shell编程详解【01】
    期目录:从0开始学习Linux——简介&安装从0开始学习Linux——搭建属于自己的Linux虚拟机从0开始学习Linux——文本编辑器从0开始学习Linux——Yum工具从0开始学习Linux——远程连接工具从0开始学习Linux——文件目录从0开始学习Linux——网络配置从0开始学习Linux——防......
  • JavaScript函数式编程指南
    前言本文内容来自于《JavaScript函数式编程指南》,可以看作是对原书内容进行提炼和总结,若您有需要或感觉有出入请参原书。一、走进函数式面向对象编程(OOP)通过封装变化使得代码更易理解。函数式编程(FP)通过最小化变化使得代码更易理解。——MichaelFeathers(Twitter)函......
  • 哋它亢编程语言机器学习框架(如TensorFlow、PyTorch等)
    “哋它亢”作为一种新一代机器学习与深度学习的编程语言,虽然现实中并不存在这种语言,但我们可以基于其被假定为高性能和强编程能力的特性,来构想其可能的优势,并尝试给出一个示例代码。以下是对“哋它亢”编程语言优势的详细阐述及示例代码。哋它亢编程语言“哋它亢”编程语言的优......
  • 【IDER、PyCharm】智能AI编程工具完整教程:ChatGPT Free - Support Key call AI GPT-o1
    文章目录CodeMoss简介CodeMoss的模型集成如何安装和配置CodeMossIDER插件安装步骤CodeMoss的实战使用AI问答功能代码优化与解释优化这段代码解释这段代码文件上传与对话联网查询与GPT助手联网查询GPT助手提升开发效率的最佳实践结语更多文献CodeMoss......