首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过递归c++检查回文

通过递归c++检查回文
EN

Stack Overflow用户
提问于 2022-01-13 15:30:33
回答 2查看 205关注 0票数 0
代码语言:javascript
复制
bool palindrome(char arr[],int size){
    if(size<=1){
        return true;
    }
    if(*(arr)==*(arr+size-1)){
        bool small_ans=palindrome(arr+1,size-2);
        return small_ans;
    }
    return false;
}

这个检查回文的代码有多高效??

EN

回答 2

Stack Overflow用户

发布于 2022-01-13 16:25:09

有编译器优化称为尾尾递归。

在您非常简单的案例中,编译器发现有可能使用此优化。因此,它悄悄地将代码转换为迭代版本:

https://godbolt.org/z/rsjaYhde6

代码语言:javascript
复制
palindrome(char*, int):
        cmp     esi, 1
        jle     .L4
        movsx   rax, esi
        sub     esi, 2
        shr     esi
        lea     rax, [rdi-1+rax]
        lea     edx, [rsi+1]
        add     rdx, rdi
        jmp     .L3
.L8:
        add     rdi, 1
        sub     rax, 1
        cmp     rdi, rdx
        je      .L4
.L3:
        movzx   ecx, BYTE PTR [rax]
        cmp     BYTE PTR [rdi], cl
        je      .L8
        xor     eax, eax
        ret
.L4:
        mov     eax, 1
        ret

注意:

  • 实际上使用递归的代码中不需要call指令。
  • 标签.L8负责替换递归的循环。

请记住,有"以此类推“,这样编译器就可以以更快的方式通过您的代码。

票数 3
EN

Stack Overflow用户

发布于 2022-01-13 15:55:59

通常,递归解决方案通常比迭代更优雅,但通常需要更多的CPU时间和内存空间。CPU必须将数据放到堆栈上,每次递归。

特别是在这种情况下,迭代在时间和内存方面似乎更有效。

试着做这样的事:

代码语言:javascript
复制
bool palindrome(char arr[], int size)
{
    for (int i = 0; i < size; ++i) {
        if (arr[i] != arr[size-1-i])
            return false;
    }
    return true;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70699104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档