首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++:递归二等分算法始终返回0

C++中的递归二等分算法是一种通过递归方式将一个问题分解为两个相同或相似的子问题,并在每个子问题上执行相同的操作,最终将结果合并的算法。在递归二等分算法中,问题被逐步划分为更小的子问题,直到达到基本情况,然后通过合并子问题的结果来解决原始问题。

递归二等分算法的基本思想是将问题分解为两个规模相等或相似的子问题,然后对每个子问题进行递归调用,直到达到基本情况。在每个递归调用中,问题的规模都会减小,直到达到基本情况,然后通过合并子问题的结果来解决原始问题。

递归二等分算法在许多领域都有应用,例如搜索算法、排序算法、图像处理、数据压缩等。它可以帮助解决一些复杂的问题,提高代码的可读性和可维护性。

在C++中,实现递归二等分算法的关键是定义递归函数和确定基本情况。递归函数应该能够将问题分解为两个相同或相似的子问题,并在每个子问题上执行相同的操作。基本情况是指问题无法再分解,需要直接解决的情况。

以下是一个示例代码,演示了如何使用递归二等分算法来计算一个数组中所有元素的和:

代码语言:txt
复制
#include <iostream>
using namespace std;

int recursiveSum(int arr[], int start, int end) {
    if (start == end) {
        return arr[start];
    } else {
        int mid = (start + end) / 2;
        int leftSum = recursiveSum(arr, start, mid);
        int rightSum = recursiveSum(arr, mid + 1, end);
        return leftSum + rightSum;
    }
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(arr[0]);
    int sum = recursiveSum(arr, 0, n - 1);
    cout << "Sum: " << sum << endl;
    return 0;
}

在这个示例中,递归函数recursiveSum将数组分为两个子数组,并在每个子数组上递归调用自身。当子数组的起始索引等于结束索引时,递归停止,返回该索引处的元素值。然后,递归函数返回两个子问题的和,最终得到整个数组的和。

腾讯云提供了丰富的云计算产品和服务,其中包括与C++开发相关的产品。您可以通过访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于腾讯云的产品和服务。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python ---- 算法入门(2)分治算法解决【找数组的最大值和最小值】问题

分治算法获取最大值 4.1 代码分析 如果列表长度是0,直接返回-1,表示没找到最大值; 当分区只有2个值时,获取其中最大的返回 将列表分割成两个区域; 获取列表的中间位置index; 递归回调,获取左边列表的最大值...; 递归回调,获取右边列表的最大值; 注意:此处切割,会将列表不断的分,直到列表中只存在一个或两个元素时,获取最大的返回,然后再左边和右边比较,返回最大值。...# 通过分治法获取列表中的最大值 def get_max(arr, left, right): # 如果列表长度是0,直接返回-1,表示没找到最大值 if len(arr) == 0:...分治算法获取最小值 5.1 求最小值代码分析 如果列表长度是0,直接返回-1,表示没找到最小值; 当分区只有2个值时,获取其中最小的返回 将列表分割成两个区域; 获取列表的中间位置index; 递归回调...,获取左边列表的最小值; 递归回调,获取右边列表的最小值; 注意:此处切割,会将列表不断的分,直到列表中只存在一个或两个元素时,获取最小的返回,然后再左边和右边比较,返回最小值。

1.6K10

【初阶数据结构篇】时间(空间)复杂度

常数时间复杂度:O(1),表示算法的执行时间不随输入规模的增长而变化,是最理想的情况。 对数时间复杂度:O(log n),通常出现在分查找等分算法中。...线性时间复杂度:O(n),表示算法的执行时间与输入规模成正比。 线性对数时间复杂度:O(n log n),通常出现在快速排序、归并排序等分算法中。...平方时间复杂度:O(n2),通常出现在嵌套循环的算法中。 指数时间复杂度:O(2n),通常出现在递归算法中。...斐波那契数列(递归法) // 计算斐波那契递归Fib的时间复杂度?...N-1,N-2一直到3递推,在n为3这个函数栈帧里调用2和1,并返回给3注意此时1和2的函数栈帧已经销毁,以此类推,返回一个销毁一个,程序在执行时同一时刻实际使用的空间不会超过n个(即往下递推的深度),

18410
  • 用x种方式求第n项斐波那契数,99%的人只会第一种

    听说有人想学数据结构与算法却不知道从何下手?那你就认真看完本篇文章,或许能从中找到方法与技巧。 本期我们就从斐波那契数列的几种解法入手,感受算法的强大与奥妙吧。...斐波那契数列指的是这样一个数列: 0、1、1、2、3、5、8、13、21、34...... 有一组数列,它的第一项为1,第项为1,从第三项开始,每一项为前两项之和。...例如,若n=0,则函数fib(0)应该返回0,若n=1, 则函数fib(1)应返回1,若 n > 1,返回 F(n-1)+F(n-2)。...若n = 9 输出:34 下面是返回斐波那契数列第n项Fn的不同方法: 方法1 (使用递归) 一个简捷的方法是直接使用递归定义关系式写出递归实现的代码,C/C++代码如下: //Fibonacci Series...滚动数组不是什么高大上的技术,我们在计算斐波那契数列的过程中,始终使用相邻的前两项,加上正在计算的项,总共就三项,因此可以定义一个长度只有3的数组,可以滚动地使用0、1、2这三个下标。

    3K20

    你知道什么是漂亮排序法吗?哦,知道,不就是臭皮匠排序法嘛!

    在《算法导论》第版第 7 章(快速排序)的思考题(第 95 页)中提及到一种 低效的递归排序算法:Stooge 排序, Howard、Fine 等教授将这个算法称为 漂亮排序算法(完美排序算法)。...代码整体的思路就是基于递归来实现的,具体操作就是:对于传入的数组先将头部与尾部进行排序,然后递归调用排序前三分之,再递归调用排序后三分之,最后再递归调用排序前三分之。...动画描述 1.第一步:对传入的数组的头尾元素进行比较 2.第步:判断能否三等分,如果可以则将数组三等分 3.第三步:同样的逻辑递归的排序数组的前 2 / 3 区域 4.第四步:同样的逻辑递归的排序数组的后...2 / 3 区域 5.第五步:同样的逻辑再次递归的排序数组的前 2 / 3 区域 排序完成!...所以,它除了好看,目前也没发现有啥用:一顿操作瞎装逼,一看性能点七! 再补充一个有趣的点,这个算法也被称之为 臭皮匠算法: 三个臭皮匠顶个诸葛亮(在代码实现中涉及到三等分这个概念)。

    80120

    【基础算法递归算法

    递归算法是一种直接或间接调用原算法算法,一个使用函数自身给出定义的函数被称为递归函数。利用递归算法可以将规模庞大的问题拆分成规模较小的问题,从而使问题简化。...无论是递归算法还是递归函数,最大的特点都是“自己调用自己”。 斐波那契数列 斐波那契数列的规律是:第一项是1,第项是1,以后每一项都等于前两项之和。我们的问题是:斐波那契数列的第n项是多少?...就像上述fibonacci()函数,当n==1||n==2时函数返回1,不再调用自己。如果一个递归函数中没有定义非递归的初始值,那么该递归调用是无法结束的,也就得不到结果。...如果文件后缀名为.cpp,则默认使用C++编译器,不能在函数内使用sizeof(arr)/sizeof(arr[0])的方法获取数组大小,sizeof(arr)得到的是指针大小。...如果使用C++的方法实现全排列,除了上面两种方法,还可以使用C++封装好的标准库函数next_permutation。

    35810

    据说这是世界上最漂亮的排序算法,了解一下

    在《算法导论》第版第 7 章(快速排序)的思考题(第 95 页)中提及到一种 低效的递归排序算法:Stooge 排序, Howard、Fine 等教授将这个算法称为 漂亮排序算法(完美排序算法)。...代码整体的思路就是基于递归来实现的,具体操作就是:对于传入的数组先将头部与尾部进行排序,然后递归调用排序前三分之,再递归调用排序后三分之,最后再递归调用排序前三分之。...2.第步:判断能否三等分,如果可以则将数组三等分 ? 3.第三步:同样的逻辑递归的排序数组的前 2 / 3 区域 ? 4.第四步:同样的逻辑递归的排序数组的后 2 / 3 区域 ?...5.第五步:同样的逻辑再次递归的排序数组的前 2 / 3 区域 ? 排序完成!...这个算法的复杂度为 T(n) = 3 T( 2n / 3 ) + 1,已被其它大牛证明时间复杂度接近于 O(n2.71) ,对比于一般的排序算法,比如冒泡、选择等常见的 O(n2) 排序算法,排序过程上慢很多

    48020

    开发成长之路(16)-- 算法小抄:思维跃迁

    ······ 此外,插入、希尔、堆排、选排、归并等一系列排序方法尽在:【C++算法集锦(1):八大排序算法 :GIF + 亲测代码 +专项练习平台 ---- 递归算法 1、明确你要干嘛 2、明确递归的结束条件...3、寻找递推关系式 4、注意边界条件与调用方式 递归中的记忆化: 详细了解递归算法:【C++算法集锦(2):递归精讲 ---- 回溯算法 第 1 步都是先画图,画图是非常重要的,只有画图才能帮助我们想清楚递归结构...如果不存在符合条件的连续子数组,返回 0。 示例: 输入: s = 7, nums = [2,3,1,2,4,3] 输出: 2 解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。...5、回到第步,直到结果序列的屁股顶到原序列的末位。 6、返回保留的最短子序列 的长度。 这是暴力解法吧,不知道为什么他们要叫这种解法为滑动窗口,还给出了不低的难度系数。。...【C++算法集锦(14):贪心算法 ----

    34220

    【每日算法Day 76】经典面试题:中序遍历的下一个元素,5大解法汇总!

    后继者[1] 题目描述 设计一个算法,找出叉搜索树中指定节点的“下一个”节点(也即中序后继)。 如果指定节点没有对应的“下一个”节点,则返回 null。...一般树+递归 那如果是一般的叉树,中序遍历就不满足单调递增了,这时候我们就只能找出中序遍历的结点顺序,然后才能得到 p 的后继结点。...一般树+Morris遍历 如果看过我前两天的一道关于叉搜索树的题解: 【每日算法Day 73】学妹大半夜私聊我有空吗,然后竟然做出这种事!...代码 BST+递归c++) class Solution { public: TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {...left : root; } } }; BST+非递归c++) class Solution { public: TreeNode* inorderSuccessor(

    42030

    C++模版的本质

    前言 C++的一些高级特性对于新人来说,很具有挑战性,而模板就是其中之一,晦涩语法让很多新人望而生畏;大多数人苦苦磨炼,却始终没有掌握这门绝学,本文通过揭开模板的一些面纱,希望帮助新人掌握模板的心法,从而学会这门武功...程序=数据结构+算法 算法就是对容器的操作,对数据结构的操作,一般算法设计原则要满足KISS原则,功能尽量单一,尽量通用,才能更好和不同容器配合,有些算法属于控制类算法(比如遍历),还需要和其他算法进行配合...模板递归 模板递归是模板元编程的基础,也是C++11变参模板的基础。 ? C++模版的应用场景 1....模板多个实例很有可能会隐式地增加进制文件的大小等,所以模板在某些情况下有一定代价,一定要在擅长的地方发挥才能; 如何降低门槛,对初学者更友好,如何降低复杂性,这个是C++未来发展重要的方向。...ISBN 0-321-22725-5.

    1.7K30

    剑指 Offer(C++版本)系列:剑指 Offer 07 重建叉树

    03 数组中重复的数字 剑指 Offer(C++版本)系列:剑指 Offer 04 维数组中的查找 剑指 Offer(C++版本)系列:剑指 Offer 05 替换空格 剑指 Offer(C++版本...)系列:剑指 Offer 06 从尾到头打印链表 剑指 Offer(C++版本)系列:剑指 Offer 07 重建叉树 1、题干 重建叉树 输入某叉树的前序遍历和中序遍历的结果,请重建该叉树...例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的叉树: 3 / \ 9 20.../ \ 15 7 限制: 0 <= 节点个数 <= 5000 通过次数158,941提交次数228,915 2、递归法 首先复习一下三种遍历: 前序遍历:根节点 | 左子树...最后,当 left > right ,代表已经越过叶节点,此时返回 nullptr ; 算法流程: 首先初始化一个哈希表,保存中序遍历值对应的索引; 递归重建叉树; 判断递归终止条件:无论是左子树还是右子树

    27820

    剑指 Offer(C++版本)系列:剑指 Offer 12 矩阵中的路径

    03 数组中重复的数字 剑指 Offer(C++版本)系列:剑指 Offer 04 维数组中的查找 剑指 Offer(C++版本)系列:剑指 Offer 05 替换空格 剑指 Offer(C++版本...)系列:剑指 Offer 06 从尾到头打印链表 剑指 Offer(C++版本)系列:剑指 Offer 07 重建叉树 剑指 Offer(C++版本)系列:剑指 Offer 09 用两个栈实现队列 剑指...Offer 11 旋转数组的最小数字 剑指 Offer(C++版本)系列:剑指 Offer 12 矩阵中的路径 1、题干 矩阵中的路径 给定一个 m x n 维字符网格 board 和一个字符串单词...算法流程: 递归参数:当前字符在矩阵 board 中的行索引 i 和列索引 j ,当前目标字符(匹配的)在目标字符串 word 中的索引 k 。...空间复杂度 O(K) : 搜索过程中的递归深度不超过 K ,因此系统因函数调用累计使用的栈空间占用 O(K) (因为函数返回后,系统调用的栈空间会释放)。

    70150

    数据结构初阶之排序(下)

    快速排序有着许多种实现方式,今天我们就hoare、挖坑法以及lomuto前后指针法来对其进行递归实现,同时还将运用数据结构中的栈来实现快速排序的非递归实现方法。...先从右向左找出⽐基准⼩的数据,找到后⽴即放⼊左边坑中,当前位置变为新的"坑",然后从左向右找出⽐基准⼤的数据,找到后⽴即放⼊右边坑中,当前位置变为新的"坑",结束循环后将最开始存储的分界值放⼊当前的"坑"中,返回当前...随后分别取栈顶与栈底元素,利用循环来实现递归操作。...归并排序核⼼步骤(如下图): 利用递归分别将待排序的数组等分割成n份,每次取一半,随后就分割后的两两数组进行合并操作(先比大小后放置) 代码的实现 void _MergeSort(int* a, int...后面我将为大家带来C++有关的知识分享,敬请期待!

    8310

    C#基础搜索算法

    递归叉搜索算法 尽管上节中的叉搜索算法函数可以正确工作, 但它其实不是解决类似搜索问题的常规方案....叉搜索函数可以使用递归方式实现(递归指函数的内部调用自身), 这是因为此算法会不断地划分数组直到找到所要的数据项或搜索完全部数组才会终止, 而每次的划分都是会得到一个新的范围更小的数据集合, 因此非常适合使用递归来实现叉搜索算法..., 使用新的搜索范围作为参数再次调用自身 return RbinSearch(value, mid + 1, upper); } } 同迭代算法相比, 递归叉搜索算法的主要问题是它的效率...当用这两种算法对含有1000个元素的数组进行排序的时候, 递归算法始终比迭代算法慢了10 倍: ? (我的电脑太快了…我换了条件测试的结果如下, 以供参考) ?...可以看到, 递归方式的叉搜索比迭代的方式要慢, 不过尽管这样, 在解决实际问题时可能是出于性能的考虑之外才选择的递归算法(不太赞同, 主要原因还是要看效率, 只不过恰好对于这个例子的需求来说, 递归效率差

    99420

    九十五、叉树的递归和非递归的遍历算法模板

    「@Author:Runsen」 刷Leetcode,需要知道一定的算法模板,本次先总结下叉树的递归和非递归的遍历算法模板。 叉树的四种遍历方式,前中后加上层序遍历。...对于叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁。...递归 下面伪代码是叉树遍历的递归算法模板,顺序是中左右,也就是前序遍历,改变中左右三行代码的顺序,前中后序三种递归遍历轻松解决。...+代码,递归算法模板一定要加上终止条件,不然一入递归深似海,从此offer是路人,来源代码随想录。...+代码,由于C++中的stack中pop之后,没有返回值,因此需要额外注意。

    43730

    硬钢百度面试!

    创建(初始化)线程池(IO密集型,线程数n+1); 创建 epoll 对连接进行监听 监听到连接事件,调用线程池线程处理 http 请求 读取 http 请求并对其进行解析 (空格,\r\n字段提取) 返回解析结果...} C++空类的大小不为0,不同编译器设置不一样,vs和lg++都是设置为1; C++标准指出,不允许一个对象(当然包括类对象)的大小为0,不同的对象不能具有相同的地址; 带有虚函数的C++类大小不为...1,因为每一个对象会有一个vptr指向虚函数表,具体大小根据指针大小确定; C++中要求对于类的每个实例都必须有独一无的地址,那么编译器自动为空类分配一个字节大小,这样便保证了每个实例均有独一无的内存地址...七、C++ sort()函数实现 sort()源码中采用的是一种叫做IntroSort内省式排序的混合式排序算法, 1.首先进行判断排序的元素个数是否大于stl_threshold,stl_threshold...快排是使用递归来实现的,如果说我们进行判断我们的递归深度有没有到达递归深度的限制阈值2*lg(n),如果递归深度没达到阈值就使用快速排序来进行排序 3.如果说大于我们的最深递归深度阈值的话,这个时候说明快排复杂度退化了

    19220

    【每日算法Day 82】面试经典题:求第K大数,我写了11种实现,不来看看吗?

    小根堆+手写 利用原地算法,直接将原数组当作一个小根堆。 首先对前 个元素建立初始堆。然后遍历后面的元素,如果大于堆顶元素的话,就和堆顶元素交换位置,并调整堆。 小根堆大小始终为 。...大根堆+手写 利用原地算法,直接将原数组当作一个大根堆。 首先对前 个元素建立初始堆。然后遍历后面的元素,如果小于堆顶元素的话,就和堆顶元素交换位置,并调整堆。 大根堆大小始终为 。...然后看 的下标 ,如果 ,那就说明 就是第 小(第 大)的元素,直接返回即可。否则如果 ,那就说明第 大元素在 的右边区间内,递归寻找即可。否则就在左边区间,递归寻找。...return nums[0]; } }; 大根堆+手写(c++) class Solution { public: void adjust(vector& nums...} return nums[0]; } }; 快速选择(c++) class Solution { public: int partition(vector&

    67820

    递归的时间复杂度(Master 公式)

    我们在解决算法问题时,经常会用到递归递归在较难理解的同时,其算法的复杂度也不是很方便计算。而为了较为简便地评估递归算法复杂度,Master公式。...在分治算法中,a 常常代表每次递归调用产生的子问题数量。例如,在归并排序中,a 的值为 2,因为每次递归调用会将问题分为两个子问题。T(N/b):表示每个子问题的时间复杂度。...O(N^d):表示除了递归调用之外,算法在每次递归步骤中所做的额外工作的时间复杂度。O(N^d) 是除了递归调用之外的时间开销的上界。d 是一个常数,表示额外工作的时间复杂度与 N 的关系。...其中的a、b、d都是常数结论:当时,;当时,;当时,;注意子问题规模必须等分,不管你是分成几部分应用举例问题:在一个长度为 N 的数组中,求最大值方法一public static int getMax(...int[] arr) { if (arr == null || arr.length == 0) { return -1; } return process(arr, 0

    17410

    C++斐波那契数列(带备忘录的递归

    C++斐波那契数列(带备忘录的递归) 斐波那契数列的数学形式就是递归的,写成代码就是这样: int fib(int N) { if (N == 1 || N == 2) return 1;...假设 n = 20,请画出递归树: [在这里插入图片描述] PS:但凡遇到需要递归的问题,最好都画出递归树,这对你分析算法的复杂度,寻找算法低效的原因都有巨大帮助。 这个递归树怎么理解?...最后遇到 f(1) 或者 f(2) 的时候,结果已知,就能直接返回结果,递归树不再向下生长了。 递归算法的时间复杂度怎么计算?就是用子问题个数乘以解决一个子问题需要的时间。...首先计算子问题个数,即递归树中节点的总数。显然叉树节点总数为指数级别,所以子问题个数为 O(2^n)。...所以,这个算法的时间复杂度为者相乘,即 O(2^n),指数级别,爆炸。

    1.2K30
    领券