C++ 不使用循环和数字的数字根递归

C++ 不使用循环和数字的数字根递归,c++,recursion,C++,Recursion,我试图解决下面这个递归问题,显然是要在不使用循环或digitsum的情况下找到digitaroot。这是可能的吗 {整数n的数字根定义为重复求和直到只剩下一个数字的结果。例如,1729的数字根 可以使用以下步骤计算: 第一步:1+7+2+9 → 19 步骤2:1+9 → 10 第三步:1+0 → 因为步骤3末尾的总数是个位数1,所以该值是数字 根 写一个函数 返回其参数的数字根的DigitalRootn。 虽然从中使用DigitSum函数很容易实现DigitalRoot 练习6和while循环,

我试图解决下面这个递归问题,显然是要在不使用循环或digitsum的情况下找到digitaroot。这是可能的吗

{整数n的数字根定义为重复求和直到只剩下一个数字的结果。例如,1729的数字根 可以使用以下步骤计算: 第一步:1+7+2+9 → 19 步骤2:1+9 → 10 第三步:1+0 →

因为步骤3末尾的总数是个位数1,所以该值是数字 根 写一个函数 返回其参数的数字根的DigitalRootn。 虽然从中使用DigitSum函数很容易实现DigitalRoot
练习6和while循环,这个问题的部分挑战是递归地编写函数,而不使用任何显式循环构造。}

我认为您应该首先将数字拆分为n%10和n/10,然后在第二方应用递归

然后问题是将其应用于结果。编写递归函数的关键是要记住,只有在传入参数<10时才必须返回而不需要子调用。

Catch!:

#include <iostream>

unsigned int digital_root( unsigned int x )
{
    if ( x < 10 ) return x;

    x = x % 10 + digital_root( x / 10 );

    return x < 10 ? x : digital_root( x ); 
}

int main(void) 
{
    std::cout << digital_root( 1729 ) << std::endl;
    std::cout << digital_root( 1917 ) << std::endl;

    return 0;
}
或者,您可以按照以下方式重写函数的return语句

unsigned int digital_root( unsigned int x )
{
    if ( x < 10 ) return x;

    x = x % 10 + digital_root( x / 10 );

    return digital_root( x ); 
}
或者函数可以看起来像这样

unsigned int digital_root( unsigned int x )
{
    return x < 10 ? x : digital_root( x % 10 + digital_root( x / 10 ) ); 
}

也许您可以从python中重新编写代码:这在几个测试用例中都起到了作用

def digitalSum(n):
  if n < 10:
      return n
  else:
      return (n%10 + digitalSum(n//10))

def digitalRoot(n):
   if digitalSum(n) > 9:
      return digitalRoot(digitalSum(n))
   else:
      return digitalSum(n)

对于x>10,连续两次检查x<10,应将返回状态更改为返回数字_根x@德拉维拉:这不重要。我知道,但不重要efficient@dlavila我认为如果没有第二次检查,它是没有效率的,因为当已经明确数字小于10时,它会再次调用自己一次。取决于输入,如果有100个递归调用,则必须与第一个版本进行99次额外比较。假设输入均匀地分布在所有无符号int值中,则第二个版本在avarage中最好。
def digitalSum(n):
  if n < 10:
      return n
  else:
      return (n%10 + digitalSum(n//10))

def digitalRoot(n):
   if digitalSum(n) > 9:
      return digitalRoot(digitalSum(n))
   else:
      return digitalSum(n)