尾递归是否适用于此代码?

时间:2014-12-13 22:49:59

标签: c++ recursion

我有一段简单的代码,代表this(声明不明确,不合适)的问题:

template<typename It>
bool isAlpha(It first, It last)
{
    return (first != last && *first != '\0') ? 
        (isalpha(static_cast<int>(*first)) && isAlpha(++first, last)) : true;
}

我正在试图弄清楚如何以尾递归方式来实现它,虽然有很多像answer这样的来源,我无法包装我的介意一下。

有人可以帮忙吗?

修改

我在下面放置反汇编代码;编译器 gcc 4.9.0 使用-std=c++11 -O2 -Wall -pedantic进行编译,程序集输出为

bool isAlpha<char const*>(char const*, char const*):
    cmpq    %rdi, %rsi
    je  .L5
    movzbl  (%rdi), %edx
    movl    $1, %eax
    testb   %dl, %dl
    je  .L12
    pushq   %rbp
    pushq   %rbx
    leaq    1(%rdi), %rbx
    movq    %rsi, %rbp
    subq    $8, %rsp
.L3:
    movsbl  %dl, %edi
    call    isalpha
    testl   %eax, %eax
    jne .L14
    xorl    %eax, %eax
.L2:
    addq    $8, %rsp
    popq    %rbx
    popq    %rbp
.L12:
    rep ret
.L14:
    cmpq    %rbp, %rbx
    je  .L7
    addq    $1, %rbx
    movzbl  -1(%rbx), %edx
    testb   %dl, %dl
    jne .L3
.L7:
    movl    $1, %eax
    jmp .L2
.L5:
    movl    $1, %eax
    ret

1 个答案:

答案 0 :(得分:3)

为了澄清cdhowie的观点,可以按如下方式重写函数(除非我犯了错误):

bool isAlpha(It first, It last)
{
  if (first == last)
    return true;
  if (*first == '\0')
    return true;
  if (!isalpha(static_cast<int>(*first))
    return false;
  return isAlpha(++first, last);
}

这确实允许消除琐碎的尾部调用。

这通常是编译器的工作。