如何跟踪递归函数 C++

2023-12-07

#include <iostream>
using namespace std;

int g(float A[] , int L , int H)
{
   if (L==H)
      if (A[L] > 0.0)
         return 1;
      else 
         return 0;
   int M = (L+H)/2;

   return g(A,L,M)+ g(A,M+1,H);
}
int main (void)
{       
   float A[] = {-1.5 ,3.1,-5.2,0.0};
   g(A,0,3);

   system ("pause");
   return 0;
}

它问我函数 g 返回什么以及该函数做什么

这是我到目前为止得到的

第一个调用是 g(A , 0 ,3) -total 跳过 IF 语句且 M = 1,因为它是 int -返回g(A,1,3) + g(A,2 3)

第二次通话 - g(A,1,3) 再次跳过 if 语句 - M = 0; - g(A,2 3) 再次跳过 if 语句 -M=2;

第三次通话 -g(A, 0,0,) 返回0 -g(A,3,3) 返回0;

所以它只返回0?

我猜它是除以中间值和某种二分搜索?


这是一种计算数组中有多少数字大于 0 的复杂方法。如果您尝试在编译器中运行它,则返回值为 1,因为数组中唯一大于 0 的数字是 3.1。

第一次运行时:

{-1.5, 3.1, -5.2, 0.0}
   0    1     2    3
   L               H

然后自从L=0 and H=3, M = (0+3)/2 = 3/2 = 1当你到达g(A, L, M) + g(A, M+1, H),你分成两个:

{-1.5, 3.1, -5.2, 0.0}
   0    1     2    3
   L               H
   L1   H1    L2   H2

让我们做左边的部分g(A, L1, H1) = g(A, 0, 1) first:

{-1.5, 3.1, -5.2, 0.0}
   0    1     2    3
   L               H
   L1   H1    L2   H2
   ^^^^^^^

再次因为L1=0, H1=1, 所以M1 = (0+1)/2 = 1/2 = 0然后你又分成两部分g(A, 0, 0) and g(A, 1, 1):

{-1.5,    3.1,    -5.2, 0.0}
   0       1        2    3
   L               H
   L1      H1      L2    H2
L11,H11 L12,H12

在左边部分,因为-1.5 <= 0所以g(A, L11, H11) = g(A, 0, 0) = 0,在右侧部分,因为3.1 > 0所以g(A, L12, H12) = g(A, 1, 1) = 1.

所以因此g(A, 0, 1) = g(A, 0, 0) + g(A, 1, 1) = 1.

做同样的事情g(A, L2, H2),你就明白了g(A, L, H) = g(A, L1, H1) + g(A, L2, H2) = 1 + 0 = 1.

@Nawaz 有一个好主意,将其可视化为二叉树,基本上从树的根部开始:

{-1.5, 3.1, -5.2, 0.0}

在迭代的第二层,将数组分成两部分:

     {-1.5, 3.1, -5.2, 0.0}
              /   \
             /     \
            /       \
           /         \
   {-1.5, 3.1}    {-5.2, 0.0}

在第三层,你再次分裂:

     {-1.5, 3.1, -5.2, 0.0}
              /   \
             /     \
            /       \
           /         \
   {-1.5, 3.1}    {-5.2, 0.0}
      /   \          /   \
     /     \        /     \
 {-1.5}   {3.1}  {-5.2}   {0.0}

在此刻L==H因此,我们可以评估节点:

     {-1.5, 3.1, -5.2, 0.0}
              /   \
             /     \
            /       \
           /         \
   {-1.5, 3.1}    {-5.2, 0.0}
      /   \          /   \
     /     \        /     \
 {-1.5}   {3.1}  {-5.2}   {0.0}
    |       |       |       |
    0       1       0       0

为了找到返回值,我们总结:

     {-1.5, 3.1, -5.2, 0.0}
              /   \
             /     \
            /       \
           /         \
   {-1.5, 3.1}    {-5.2, 0.0}
      0+1=1          0+0=0

最后

     {-1.5, 3.1, -5.2, 0.0}
             1+0=1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何跟踪递归函数 C++ 的相关文章

  • 您可以从基本 Win32 控制台模板应用程序中的 C#/Winrt 组件调用(不是 WinForm/abstractions/wrappers 或使用 C++/Winrt 模板)吗?)

    我有一个现有的程序 win32 x86 控制台应用程序 需要调用托管代码 来自 Net 的 C dll The dll不暴露给 COM 但可以从 C WinRT 组件调用并由 C WinRT 控制台模板应用引用 BUT即使安装了 C Win
  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • 一元 +/- 运算符如何可能导致“-a”或“+a”中的整数提升,“a”是算术数据类型常量/变量?

    这句看似微不足道的台词摘自我的迈克 巴纳汉和布雷迪的 C 书 第 2 8 8 2 节 http publications gbdirect co uk c book chapter2 expressions and arithmetic h
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 为什么这个递归函数返回未定义?

    我正在尝试编写一个使用递归组合两个字符串的函数 我的代码如下 但我不知道为什么该函数返回未定义 特别是当我在基本情况下使用 console log 时 它不会打印未定义而是打印正确的值 var str3 function merge str
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne

随机推荐

  • 为什么此 JavaScript 会在 IE 中导致“权限被拒绝”错误

    下面的代码抛出一个Permission DeniedIE 中的错误 引用 jQuery 1 6 2 第 6244 行 Char 2 function addAgreement var url window location toString
  • 四元数 * Vector3 * 距离

    有人可以帮我理解以下乘法的结果吗 在Unity VR示例项目中 使用了以下两行 Quaternion headRotation InputTracking GetLocalRotation VRNode Head TargetMarker
  • 精确的流程事件时间线图(例如在 Excel 中)

    我需要准备这样的图表 我认为如何阅读此图非常直观 这就是为什么我想为我的项目创建其中一些 我很困惑如何有效地创建它们 我在 画图 中画了上面的一个 只是为了快速可视化我的想法 但我认为花了太长时间 而且时间轴也不准确 我有事件时间的精确数据
  • COCOS2D-X:比例精灵

    我想按原始图像的高度设置精灵的比例 然后该精灵的宽度将遵循该图像的原始比例 我怎样才能做到这一点 感谢您的所有帮助 CCSprite有一个成员函数 virtual void setScale float scale 参考 setScale
  • 如何从jsf中的bean抛出404

    我需要抛出 404 并将访问者带到特定页面 我正在尝试使用以下代码 FacesContext facesContext FacesContext getCurrentInstance ExternalContext externalCont
  • 将php的返回值传递给js

    我有 3 个文件 main php action js 和 ajax php 并且我成功地将一些 div 的单击内容从 main php 更改为一些 ajax php 并在我的 javascript 文件中进行了 ajax 调用 它看起来像
  • python全局解释器锁GIL问题

    我想在网络上提供一项服务 人们可以测试算法的性能 该算法是用 python 编写并在 Linux 机器上运行的 基本上我想做的是 有一个非常简单的 PHP 处理程序 比如说 start algo php 它接受来自浏览器的请求 并在 php
  • 使用 JavaScript 从 url 获取数组

    我有带有参数的 URL 我可以获取除数组之外的所有参数 这是我的 URL 解码 name myname type Restaurant Cuisine Moderne Cr ative heure 06 00 06 30 nbrPers 1
  • 找不到 Pyinstaller GLIBC_2.15

    在 Linux 32 位 Ubuntu 11 上生成了一个可执行文件 并在 32 位 Ubuntu 10 上对其进行了测试 但失败并显示 GLIBC 2 15 未找到 Cyrhon 常见问题解答部分说 在 Linux 下 我收到与 libc
  • 多个项目的区域 - 在子项目中找不到视图

    我一直在关注 MSDN 上的这个指南 使用多个项目创建 ASP NET MVC Areas 应用程序 由于 ASP NET MVC 2 0 只是预览版 人们可能会认为存在一些错误 我的问题是 它根本不起作用 至少不是应该的方式 设置完所有内
  • 在elasticsearch 5中聚合_field_names

    我正在尝试聚合 ES 5 中的字段名称 如中所述不同键上的 Elasticsearch 聚合但那里描述的解决方案不再有效 我的目标是获取所有文档的密钥 映射是默认映射 Data PUT products product 1 param fi
  • 有没有办法暂停气流 DagRun?

    有没有办法暂停 Airflow 中的特定 DagRun 我希望能够对单个 DAG 进行多个同时执行的运行 并且我希望能够在某些点单独暂停这些运行 取消暂停 暂停功能似乎仅在 DAG 级别起作用 并暂停 取消所有 DagRun 针对该 DAG
  • 将 Keras 增强数据保存为 numpy 数组

    使用喀拉斯图像数据生成器 我们可以将增强图像保存为 png 或 jpg for X batch y batch in datagen flow train data train labels batch size batch size sa
  • ES6类构造函数不能像普通函数一样调用的原因是什么?

    ES6 类构造函数不能作为普通函数调用 根据 ES6 aTypeError完成此操作后应提出 我曾经认为类只是原型中的构造函数 函数的语法糖 但这使得它稍微不那么重要 我想知道 这背后的理由是什么 除非我错过了什么 否则它会阻止使用自定义调
  • 使用 Python 将纬度、经度、值 CSV 转换为栅格地图

    如果我有一个包含纬度 经度和值字段的 CSV 数据集 那么使用 python 生成栅格地图的最佳方法是什么 栅格 Z 字段可以是该表中的任何列 L5 L6 L7 L8 L9 L10 L11 L12 L13 L14 LAT LON 3 571
  • 在c#中解析阿拉伯日期

    在我正在编写的应用程序中 我想解析 C 中阿拉伯语的特定日期 例如 日期可能如下所示 但我想要这个输出 30 12 1989 我的问题是如何在 C 中执行此操作以从此字符串中获取 DateTime 对象 谁能告诉我该怎么做 东方阿拉伯数字不
  • 带有字母 A-Z 或其他自定义范围的 jQuery UI Spinner

    有没有办法自定义 jQuery UI 微调器 以便可以使用 A Z 字母 或任何自定义范围 是的 这是可能的 这是一个使用 A Z 的简单示例 改编自提供的时间示例 widget ui alphaspinner ui spinner opt
  • Javascript 中的 RTL 确认和警报

    你能做一个confirm or alert显示其消息 RTL 并右对齐 尝试在消息的开头添加以下内容 u200f u200f 例如 alert u200f u200f message or confirm u200f u200f messa
  • 如何向 PropertySheet 添加夹具?

    我有一个类源自CPropertySheet 我想在对话框的右下角插入一个 夹具 我的对话框已经可以调整大小 我只是无法插入夹具 不知道有没有什么特殊的API可以做到这一点 一种选择是手动绘制它 然后覆盖ON WM NCHITTEST并返回H
  • 如何跟踪递归函数 C++

    include