我需要通过递归解决此问题,这是他们要求执行的操作: 编写一个递归函数,该函数需要一个正数,并从右向左返回其数字的总和(+,-),例如(例如):数字为56894,总和为4-9 + 8-6 + 5 = 2。 另一个例子,数字是7762348,总和是8-4 + 3-2 + 6-7 + 7 = 11。
我下面的解决方案正确吗?我尝试用很多数字进行编译,这似乎是正确的,但需要确定。
这是我的递归解决方案:
int func(int num){
if(num/10 ==0)
return num;
return (num%10) - func(num/10);
}
答案 0 :(得分:1)
您的解决方案似乎是正确的-问题要求您这样做:
ABCD -> D - C + B - A
但是您的代码可以:
ABCD -> (D - (C - (B - A)))
虽然并不难证明:
(D - (C - (B - A))) == (D + -1 * (C + -1 * (B - A)) == D - C + B - A
或一些类似的非正式证明。但是,如果代码两次计算num/10
而不是使用局部变量来存储商,则该代码是否被认为是正确?
int func(int number) {
int quotient = number / 10;
if (quotient == 0) {
return number;
}
return number % 10 - func(quotient);
}
或者,这似乎是与div()
和div_t
一起玩的机会:
#include <stdlib.h> // where div() and div_t are found
int func(int number) {
div_t result = div(number, 10);
if (result.quot == 0) {
return number;
}
return result.rem - func(result.quot);
}
可能在每次迭代中避免另一次划分。