【递归搜索回溯专栏】专题一递归:快速幂

简介: 【递归搜索回溯专栏】专题一递归:快速幂


题目来源

本题来源为:

Leertcode 50.Pow(x,n)

题目描述

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。

算法原理

解法一:暴力+循环

看到这个题很容易就想到暴力解决。

例如2的10次方,我们就让循环10次,每次进行相乘,但这么做肯定会超时。

解法二:快速幂

快速幂是一个算法,有两种解决办法:

  1. 递归
  2. 循环
    这里我们讲解递归的方法:

例子1:316的计算:

我们将16次方拆成两个8次方相乘,将8次方拆成两个4次方相乘,依次内推,当数是1次方的时候,我们拆成3的0次方。而这个0次方也将作为我们的出口,因为0次方在拆也还是0次方。

例子2:321

首先将21次方拆成一半,除不尽,就在多乘以本身这个值,依次内推。

分析到这,我们其实已经发现这道题相同的子问题了,那么就用递归来解决:

相同子问题->函数头

本题相同子问题很好分析,就是计算xn;

只关心每个子问题做了什么->函数体

那么子问题应该做什么呢?

分两步:

  1. 先计算x的一半次方的值,将其保存起来。
  2. 看这个结果能否被除尽,能除尽直接返回,不能除尽就在这个值的基础上再乘一个x.

函数出口

写递归一定要写出口,防止造成死循环。

本题函数出口就是当n==0的时候,返回1即可。

细节问题:

其实分析到返回值,就可以代码实现,但是还要注意一下细节问题。

因为n有可能会无穷大也有可能会无穷小或者为负数:

  1. 当为负数时:

    我们在计算完结果跟1进行相除,变成分数。
  2. 当为无穷小时:

    我们将其进行强转即可。

代码实现

class Solution 
{
public:
    double myPow(double x, int n) 
    {
        //注意判断是否为负数以及数据溢出进行强转
        return n<0?1.0/pow(x,-(long long)n):pow(x,n);
    }
    double pow(double x,long long n)
    {
        //递归出口:
        if(n==0)
        return 1.0;
        //保存值
        double tmp=pow(x,n/2);
        //判断是否除尽
        return n %2 ==0?tmp*tmp:tmp*tmp*x;
    }
};
相关文章
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
36_T5与编码器-解码器架构
T5(Text-to-Text Transfer Transformer)是由Google Research于2019年提出的一种革命性的预训练语言模型。它的核心创新在于提出了一种统一的框架,将所有自然语言处理(NLP)任务都转换为文本到文本的格式,即输入和输出都是文本序列。
|
机器学习/深度学习 数据采集 数据挖掘
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
因果推断方法为特征工程提供了一个更深层次的框架,使我们能够区分真正的因果关系和简单的统计相关性。这种方法在需要理解干预效果的领域尤为重要,如经济学、医学和市场营销。
451 1
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
|
算法 C语言
【数据结构】快速排序(4种方式实现)
【数据结构】快速排序(4种方式实现)
444 1
|
存储 前端开发 搜索推荐
使用session.setAttribute存储会话属性
使用session.setAttribute存储会话属性
|
监控 Java Sentinel
Spring Cloud微服务架构
Spring Cloud微服务架构
204 1
|
存储 搜索推荐 索引
排序算法 - 快速排序(4种方法实现)
排序算法 - 快速排序(4种方法实现)
340 0
|
搜索推荐 数据挖掘 API
积分商城系统模块功能搭建开发源码部署规则解析
积分商城系统模块功能搭建开发源码部署规则解析
Golang面试:关于内存分配、管理以及泄漏的一切
Golang面试:关于内存分配、管理以及泄漏的一切
|
人工智能 自然语言处理 Python
TF-IDF:概念与python实现
TF-IDF:概念与python实现
TF-IDF:概念与python实现