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