我无法在下面提到的问题中找到递归的逻辑。 给定非负int n,将7的出现次数作为数字
返回EG。 Count7(777)= 3
EG。 Count7(123)= 0
EG。 Count7(171)= 1
这是我应用的逻辑
在一个地方计算7个数字+在所有其他地方计算7个数量。
例如13767
计算(1)中的7个数字+(3767)中的7个计数数字,就像5!= 5 * 4的阶乘程序一样!
count7(n)
{
if (n==0) {
return 0;
}
if (n==7) {
return 1;
}
if (n!=7) {
return 0;
}
return count7(n%10)+count7(n/10)
}
感谢任何建议或帮助。
答案 0 :(得分:2)
你有
if (n==7) return 1;
接着是
if (n!=7) return 0;
由于n
是7或不是7,所以后来发生的一切都不会被调用。相反,你可能想要
if (n<10) return 0;
因为你想为超过1位的数字调用递归,如果你到达最后一位数,则在这里打破。
顺便说一句,您也可以删除if (n==0)
部分,因为n<10
也涵盖了此部分。
答案 1 :(得分:0)
基本案例检查是否只有一个数字,是否为7
。然后,我们递归地将剩余数字中的7
个数添加到之前找到的任何数字rem == 7 ? 1 : 0
)。这只是另一个简单的计划。我相信你可以从这里接受。
#include <stdio.h>
int count7(int i)
{
int rem = i % 10; // remainder
int quo = i / 10; // quotient
if (rem == i) { // base case - check for a single digit.
if (rem == 7)
return 1;
else
return 0;
} else {
return (rem == 7 ? 1 : 0) + count7(quo);
}
}
int main(void) {
int i = 12;
printf("%d\n", count7(i));
}
答案 2 :(得分:0)
以下代码完全正常运行。
#include<stdio.h>
void main()
{
printf("%d\n",count7(717));
}
int count7(int n)
{
if(n==7)
return 1;
else if(n<10)
return 0;
else
return count7(n%10)+count7(n/10);
}
答案 3 :(得分:0)
我在您的代码中发现了一些问题,
critical problem
是您检查是否n!=7
并且检查是否n==7
该组合将等于询问条件if() {} else {}
,这意味着在这种情况下
你不会到达下一行 - return count7(n%10)+count7(n/10)
从不!!!!
我看到的另一件事是你在返回count7
时调用剩余的数字,它会起作用,但如果你需要做一个简单的操作(只检查余数== 7) )所以我的建议是使用? :
条件而不是在你不需要时跳转到函数。
我的问题代码:
int count7(int n)
{
return n==0 ? 0 : (n==7 ? 1 : count7(n/10) + (n%10 == 7 ? 1 : 0) );
}
另一个代码更易读(做同样的工作):
int count7(int curNum)
{
int curModNum=n%10;
int curDivNum=n/10;
if (currentNum==EMPTY_NUM) {
return EMPTY_NUM;
}
if (curNum==LUCKY_NUM) {
return ADD_ONE;
}
return count7(curDivNum) + (curModNum == LUCKY_NUM ? ADD_ONE : EMPTY_NUM);
}