九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(6)高效率的幂运算

  一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记

用C++/lua/python/bash的四重实现(6)高效率的幂运算

write by** 九天雁翎(JTianLing) –
blog.csdn.net/vagrxie
**

 

«Data Structures and Algorithm Analysis in C++»

--《数据结构与算法分析c++描述》 Mark Allen Weiss著 人民邮电大学出版 中文版第46面,图2-11
一个高效率的幂运算,应该还算不上最高效率的,但是作为一个递归及O(logn)的例子还是很合适的,因为足够的简单。

bash的实现我发现老是用普通程序语言的思想是不行了,麻烦的要死,于是用命令替换实现了一个b版本,明显效果好的多:)用一个语言就是要用一个语言的特性。

来个截图,惯例。我好像喜欢上了这种一下排4,5个窗口然后照相的方式,呵呵,特有成就感。

从左自右依次是cpp,lua,python,bash,bash(b实现)。

write by 九天雁翎(JTianLing)
-- www.jtianling.com

以下为实现部分:

CPP:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

**bool**  IsEven(**int**  x)
{
    **return**  (x % 2 == 0);
}

**long**  MyPow(**long**  x, **int**  n)
{
    **if**( 0 == n)
        **return** 1;
    **if**  ( IsEven(n))
        **return**  MyPow( x * x, n / 2);
    **else**
        **return**  MyPow( x * x, n / 2 ) * x;
}

**int**  main(**int**  argc, **char** * argv[])
{
    printf("pow(2,2)=%ld/n",MyPow(2,2));
    printf("pow(2,3)=%ld/n",MyPow(2,3));
    printf("pow(2,4)=%ld/n",MyPow(2,4));
    printf("pow(2,5)=%ld/n",MyPow(2,5));
    printf("pow(2,6)=%ld/n",MyPow(2,6));

    exit(0);
}

LUA:

#!/usr/bin/env lua

function isEven(n)
    **return**  n % 2 == 0
end

function pow(m, n)
    **if**  n == 0 **then**
        **return**  1
    **end**

    **if**  isEven(n) **then**
        **return**  pow( m * m, n / 2)
    **else**
        **return**  pow( m * m, math.floor(n / 2) ) * m
    **end**
end

-- Test Code
print("pow(2,2)=" .. pow(2,2));
print("pow(2,3)=" .. pow(2,3));
print("pow(2,4)=" .. pow(2,4));
print("pow(2,5)=" .. pow(2,5));
print("pow(2,6)=" .. pow(2,6));

PYTHON:

#!/usr/bin/env python

**def**  IsEven(n):
    **return**  n % 2 == 0

**def**  MyPow(m,n):
    **if**  n == 0:
        **return** 1

    **if**  IsEven(n):
        **return**  MyPow(m * m, n / 2)
    **else** :
        **return**  MyPow(m * m, n // 2) * m


**def**  test():
    **print**  "pow(2,2)=" + str(MyPow(2,2))
    **print**  "pow(2,3)=" + str(MyPow(2,3))
    **print**  "pow(2,4)=" + str(MyPow(2,4))
    **print**  "pow(2,5)=" + str(MyPow(2,5))
    **print**  "pow(2,6)=" + str(MyPow(2,6))

**if**  __name__ == '__main__':
    test()

BASH:

#!/usr/bin/env bash

isEven**()**
{
    **local**  m=$1
    **if**  (( m % 2 **==**  0))
    **then**
        **return**  1
    **else**
        **return**  0
    **fi**
}

pow**()**
{
    **local**  m=$1
    **local**  n=$2

    **if**  (( n **==**  0 ))
    **then**
        **return**  1
    **fi**

    **local**  m2
    **local**  n2
    **((**  m2 **=**  m * m **))**
    **((**  n2 **=**  n / 2 **))**

    isEven n
    **r=** $?
    **if**  (( r **==**  1 ))
    **then**
        pow $m2 $n2
        **return**  $?
    **else**
        pow $m2 $n2
        **local**  r2=$?
        (( r2 * **=**  m ))
        **return**  $r2
    **fi**
}

**echo**  -n  **"** pow(2,2)=**"**
pow 2 2
**echo**  $?
**echo**  -n  **"** pow(2,3)=**"**
pow 2 3
**echo**  $?
**echo**  -n  **"** pow(2,4)=**"**
pow 2 4
**echo**  $?
**echo**  -n  **"** pow(2,5)=**"**
pow 2 5
**echo**  $?
**echo**  -n  **"** pow(2,6)=**"**
pow 2 6
**echo**  $?

BASH(b实现):

#!/usr/bin/env bash

isEven**()**
{
    **local**  m=$1
    **if**  (( m % 2 **==**  0))
    **then**
        **echo**  1
    **else**
        **echo**  0
    **fi**
}

pow**()**
{
    **local**  m=$1
    **local**  n=$2

    **if**  (( n **==**  0 ))
    **then**
        **echo**  1
        **exit**  0
    **fi**

    **local**  m2
    **local**  n2
    **((**  m2 **=**  m * m **))**
    **((**  n2 **=**  n / 2 **))**

    **r=** `isEven $n`
    **if**  (( r **==**  1 ))
    **then**
        **local**  r1=`pow $m2 $n2`
        **echo**  $r1
    **else**
        **local**  r2=`pow $m2 $n2`
        (( r2 * **=**  m ))
        **echo**  $r2
    **fi**
}

**echo**  -n  **"** pow 2 2 = **"**
pow 2 2
**echo**  -n  **"** pow 2 3 = **"**
pow 2 3
**echo**  -n  **"** pow 2 4 = **"**
pow 2 4
**echo**  -n  **"** pow 2 5 = **"**
pow 2 5
**echo**  -n  **"** pow 2 6 = **"**
pow 2 6

 

 

 

 

 

write by** 九天雁翎** (JTianLing) – www.jtianling.com

分类:  Lua  Python  算法 
标签:  Bash  C++  Lua  Python  《数据结构与算法分析-C++描述》 

Posted By 九天雁翎 at 九天雁翎的博客 on 2008年11月30日

前一篇: 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(5)欧几里得算法欧几里得算法求最大公约数 后一篇: 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 习题2.8 随机数组的三种生成算法(补) 将bash的实现翻译成比较纯正的bash风格