编码蝙蝠初学者递归

时间:2017-09-20 06:44:25

标签: c recursion

我无法在下面提到的问题中找到递归的逻辑。 给定非负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)
}

感谢任何建议或帮助。

4 个答案:

答案 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); 
}