power函数的非递归经典实现(时间复杂度仅仅为logn)

#include<iostream>
using namespace std;

template <class T,class Integer>
T power(T x,Integer n)
{
    if(n == 0) return 1;
    if(n == 1) return x;
    while((n&1) == 0)
    {
        x = x*x;
        n >>= 1;
    }
    T result = x;
    n >>= 1;
    while(n != 0)
    {
        x = x*x;
        if((n&1) != 0)
            result *= x;
        n >>= 1;
    }
    return result;
}

int main()
{
    int x = 2;
    int n = 30;
    cout<<power<int,int>(x,n)<<endl;
    return 0;
}

时间: 2024-11-02 17:37:45

power函数的非递归经典实现(时间复杂度仅仅为logn)的相关文章

高效率的取幂运算,递归解法跟非递归解法

long int Pow( long int x, unsigned int n ) { // 求幂运算 if( n == 0 ) return 1; if( n == 1 ) return x; if( n % 2 == 0 ) return Pow( x * x, n / 2 ); else return Pow( x, n - 1 ) * x; // 可以用下列的注释行替换 //return Pow( x * x, n / 2 ) * x; } 上面的是递归解法,时间复杂度为 O(logN

【LeetCode-面试算法经典-Java实现】【144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)】

[144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, return the preorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [1,2,3]. Note: Recursive solution

【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】

[145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive soluti

[C++]LeetCode: 93 Binary Search Tree Iterator (经典题,非递归的中序遍历)

题目: Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST. Calling next() will return the next smallest number in the BST. Note: next() and hasNext() should run in average O(1) time and u

每天刷个算法题20160524:阿克曼函数的递归转非递归解法

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51524754 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西

Fibonacii非递归

记得在我们最开始学习C语言的时候,每当讲到递归,无论是课本上,还是老师,都会给出两个经典例子的递归实现,其中一个就是阶乘,另外一个就是Fibonacci(中文多译成斐波那契)数列了. 用递归方法计算阶乘的代码如下: //递归计算阶乘 long Factorial(int n) {     if (n <= 0)     {         return 1;     } return n * Factorial(n - 1); } 这样的递归是一个很明显的尾部递归的例子,所谓的尾部递归(tail

递归与非递归及其相互转换

一.什么是递归 递归是指某个函数直接或间接的调用自身.问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出,这些子问题的解就构成里原问题的解了. 二.递归的几个特点 1.递归式,就是如何将原问题划分成子问题. 2.递归出口,递归终止的条件,即最小子问题的求解,可以允许多个出口. 3.界函数,问题规模变化的函数,它保证递归的规模向出口条件靠拢 三.递归的运做机制 很明显,很多问题本身固有的性质就决定此类问题是递归定义,所以递归程序很直接算法程序结构清晰.思路明了.

如何将递归转换为非递归

递归函数具有很好的可读性和可维护性,但是大部分情况下程序效率不如非递归函数,所以在程序设计中一般喜欢先用递归解决问题,在保证方法正确的前提下再转换为非递归函数以提高效率. 函数调用时,需要在栈中分配新的帧,将返回地址,调用参数和局部变量入栈.所以递归调用越深,占用的栈空间越多.如果层数过深,肯定会导致栈溢出,这也是消除递归的必要性之一.递归函数又可以分为尾递归和非尾递归函数,前者往往具有很好的优化效率,下面我们分别加以讨论. 尾递归函数 尾递归函数是指函数的最后一个动作是调用函数本身的递归函数,

算法之归并排序的递归与非递归的实现

一.什么是归并排序 归并排序就是将多个有序的数据段合成一个有序的数据段,如果参与合并的只有两个有序的数据段,则称为二路归并.与快速排序和堆排序相比,其最大的特点是一种稳定的算法,算法的平均时间复杂度O(nlog2n). 二.归并排序的基本思路 (1).对于一个原始的待排序表,可以将R[1]到R[n]可以看做是n个长度为1的有序表,即分解. (2).进行第一趟归并,即将上述的n个子序两两合并,得到 n/2向上取整 个有序表,若n为奇数,则归并到最后一个子序列长度为1,即合并. (3).再将两个 n