C 中的递归函数:return 总是必要的吗?

2023-12-31

这是我第一次使用递归函数,我编写的这个函数如果仅包含按升序排列的字母,则返回字符串的大小,否则返回 -1。

在我取出第二个“返回”后,我不明白为什么它对这两个代码都有效。一个比另一个更浪费吗?希望有一些见解。

with "returnonly_ascending_letters(字符串,索引+1);”

 #include <stdio.h>

    int only_ascending_letters(char string[], int index);

    void main() {
        char string1[]="Hi my name is pete";
        char string2[]="aabcdefg";

        printf("the first string is %d and the second one is %d\n",only_ascending_letters(string1,0),only_ascending_letters(string2,0));

    }

    int only_ascending_letters(char string[], int index){
        if(!string[index]) return index;
        if(((string[index]>='a'&&string[index]<='z')||(string[index]>='A'&&string[index]<='Z'))&&((string[index]<=string[index+1])||!string[index+1])) 
            return only_ascending_letters(string, index+1);
        else return -1;

    }

与“only_ascending_letters(字符串,索引+1);”

 #include <stdio.h>

    int only_ascending_letters(char string[], int index);

    void main() {
        char string1[]="Hi my name is pete";
        char string2[]="aabcdefg";

        printf("the first string is %d and the second one is %d\n",only_ascending_letters(string1,0),only_ascending_letters(string2,0));

    }

    int only_ascending_letters(char string[], int index){
        if(!string[index]) return index;
        if(((string[index]>='a'&&string[index]<='z')||(string[index]>='A'&&string[index]<='Z'))&&((string[index]<=string[index+1])||!string[index+1])) 
        /*Took out the return*/ only_ascending_letters(string, index+1);
        else return -1;

    }

是的,你绝对need回报。请注意,C 语言规则对此问题有点宽松,如果您没有使用返回值,那么没有它也没关系。但是,您使用返回值,因此需要 return 语句。

您所看到的可能是由某些架构上的函数通过将众所周知的寄存器设置为该值(i386 上的 eax)返回(整数值)的实现细节引起的。因此,如果最底层的递归调用确实return并设置这个寄存器,并且中间的调用不会踩踏该寄存器,你会看到它是有效的。但是,您不能依赖于此。

请注意,好的编译器会识别这是尾递归调用,并以基本相同的方式编译这两个变体。

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

C 中的递归函数:return 总是必要的吗? 的相关文章

  • 是否需要销毁运算符删除的形式才能真正销毁对象?

    C 20 添加了破坏形式operator delete区别于std destroying delete t范围 它导致delete表达式在调用之前不再销毁对象operator delete 目的是在显式调用对象的析构函数和释放内存之前 允许
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • OpenCV 构建中的可选库提供什么?

    我正在尝试从源代码 最新的 SVN 主干 构建 OpenCV 并且有几个 可选 依赖项 它们本身的下载量将达到数 GB 尤其是使用 Qt 框架时 例如 CUDA 幽灵脚本 MIKTEX PYTHON EIGEN IPP JASPER JPE
  • 在没有 OpenMP 的计算机上忽略它

    我有一个使用 OpenMP 的 C 程序 该程序将在可能安装或未安装 OpenMP 的多台计算机上运行 我怎样才能让我的程序知道机器是否没有 OpenMP 并忽略它们 include
  • 从堆栈跟踪行号获取实际的 jsp 行号?

    这是堆栈跟踪 org apache jsp showcustomer jsp jspService showcustomer jsp java 128 org apache jasper runtime HttpJspBase servic
  • HTML5 CSS:行和调整大小

    下面的代码是响应式的 可以调整大小等 但我正在寻找一些真正简单的 CSS 来在桌面和移动设备上调整大小 我知道我可以使用标题链接 w3 css 中的 CSS 但必须有一种更好的方法来轻松地在桌面和移动设备上显示某些内容 移动设备默认显示内联
  • 打印/另存为 PDF(保留 CSS 布局)

    当我简单地打印 如在纸上 或将页面另存为 PDF 使用浏览器内置工具 时 CSS 会被完全忽略 我只会看到一行又一行的内容 有没有办法做到这一点 无需转换 HTML 2 PDF 图像 Thanks 这可能是因为你有media指定的选项
  • 当 SSM 代理变为活动状态时捕获事件

    我想在 SSM 的 Fleet Manager 中注册新的 EC2 实例时触发 lambda 这意味着可以使用 SSM 连接到该实例 但是我找不到在 EventBridge 中使用的模式 在 EventBridge 中 我尝试使用在文档中找
  • 在 SQL Server 2005 上违反 INSERT WHERE COUNT(*) = 0 上的 UNIQUE KEY 约束

    我正在从多个进程插入 SQL 数据库 这些进程有时可能会尝试将重复数据插入表中 我尝试以处理重复项的方式编写查询 但我仍然得到 System Data SqlClient SqlException Violation of UNIQUE K
  • nginx - laravel - hhvm-Fastcgi 出现错误 500

    I install a LEMP server in ubuntu 12 04 LTS 64 whit HHVM Fastcgi Service and i install laravel via laravel phar and test
  • 根据浏览器高度和宽度保持纵横比和字体大小?

    下面的代码附在window onresize resize The baseWidth and baseHeight在负载上读取作为计算的基础 这main变量只需将其设置到主 html 节点即可定义 字体设置在块元素上会导致所有的em基于其
  • ASP.NET Core 1.0 是否支持 ApiExplorer?如何使用它?

    ASP NET Core 1 0支持使用API Explorer吗 我无法找到任何有关它的文档或如何使用它 有人使用过它并且可以分享一些见解吗 Itay的回答帮助我得到了我想要的答案 Rob Lang 博士向任何需要使用 ApiExplor
  • ajax 调用的生命周期是多长?

    假设我在 javascript 中有这段代码 function doAnAjaxCall var xhr1 new XMLHttpRequest xhr1 open GET mylink true xhr1 onreadystatechan
  • 错误:运算符“++”的操作数必须是左值

    In C i j 在代码中工作正常 但是当我使用时 i j 我收到以下错误 Operand for operator must be an lvalue 为什么我会收到此错误 后自增要求操作数应该是可修改的左值但后自增的结果是prvalue
  • 会话超时混乱 - session.setMaxInactiveInterval(0)

    我是 JEE 的新手 这让我感到困惑 根据HttpSession html setMaxInactiveInterval int 间隔 http docs oracle com javaee 7 api javax servlet http
  • 共享 OpenGL VAO/VBO/等。通过 QGLWidget

    我正在使用 QGLWidgets 的 3 层层次结构在我的类似 CAD 的应用程序中的 5 个 OpenGL 视口之间共享着色器和顶点数据 根上下文用于编译应用程序范围的着色器 每个文档上下文用于共享模型顶点数据 视口上下文是实际进行渲染的
  • 如何在 XML 属性值中包含 &、<、> 等

    我想创建一个 XML 文件 用于存储 Java 程序的结构 我能够成功解析 Java 程序并根据需要创建标签 当我尝试将源代码包含在标签中时 问题就出现了 因为 Java 源代码可能使用大量实体引用和保留字符 例如 lt gt 我无法创建有
  • d3 过滤后无法附加完整数据

    我有一个项目的简化版本 我将其浓缩为以下片段 var margins top 20 bottom 300 left 100 right 100 var height 600 var width 1200 var totalWidth wid
  • 将 GraphML 转换为 GV 或 Dot 文件

    如何使用 graphml 文件作为输入在 graphviz 中绘制图形 I know graphviz附带graphml2gv为此目的 但是当我尝试从命令提示符运行此命令时 我收到此消息 cvtgxl not configured for
  • 如何在我的父 git 项目中使用 git 存储库?

    我尝试使用子模块将 github 存储库中的副本保留在我的第 3 方目录中 创建并获取文件后 当我从项目提交时 它只能看到文件夹 看不到文件 是的 文件在那里 有具体命令吗 在 GitHub 上 你只会看到一个灰色文件夹 https sta
  • Jackson 中的 readValue 和 readTree:何时使用哪个?

    我刚刚开始使用 Jackson JSON 库 Jackson 是一个非常强大的库 但它有非常广泛的 API 很多事情可以通过多种方式完成 这使得你很难在杰克逊找到自己的方式 如何知道什么是正确 最好的做事方式 为什么我要使用这个解决方案 S
  • C 中的递归函数:return 总是必要的吗?

    这是我第一次使用递归函数 我编写的这个函数如果仅包含按升序排列的字母 则返回字符串的大小 否则返回 1 在我取出第二个 返回 后 我不明白为什么它对这两个代码都有效 一个比另一个更浪费吗 希望有一些见解 with returnonly as