【问题标题】:Recurrence relation of recursive function that contains while loop包含while循环的递归函数的递归关系
【发布时间】:2023-09-20 01:26:01
【问题描述】:

我有一个递归函数int digit_sum(int number);,它返回数字中所有数字的总和。例如,digit_sum(159) = 1 + 5 + 9 = 15。

函数如下:

int digit_sum(int n)
{
  if (n < 0)
    n = -n;

  if (n < 10)
    return n % 10;

  while (n % 10 == 0 && n > 0)
    n = n / 10;

  return n % 10 + digit_sum(n - (n % 10));
}

我不确定如何为此函数编写递归关系。我知道 T(0) 是前两个 if 语句常量的总和。但是,对于 T(n),我不确定如何表达 while 循环项和 T(n-k)。

模运算符让我失望。这是一个猜测,我相当肯定这是错误的:

T(n) = c_1 + c_2 + c_3*n (while 循环) + (n mod 10 + T(n - (n mod 10))) for n >= 10

我知道整个 T(n-k) 项是错误的。

【问题讨论】:

  • if (n &lt; 10) return n % 10; 太过分了。使用if (n &lt; 10) return n;
  • 您必须返回个位数加上数字的 digit_sum 除以 10(即数字移位)或如果是最后一个数字,则加上数字本身。

标签: c recursion while-loop modulo recurrence


【解决方案1】:

这是一个可能的解决方案:

#include <stdio.h>

int digit_sum(int n)
{
    if (n < 0)
        return digit_sum(-n);
    if (n < 10)
        return n;
    return (n % 10) + digit_sum(n / 10);
}

int main(int argc, char *argv[])
{
    printf("   9->%d\n", digit_sum(9));
    printf("  59->%d\n", digit_sum(59));
    printf(" 159->%d\n", digit_sum(159));
    printf("-159->%d\n", digit_sum(-159));
}

【讨论】:

    最近更新 更多