【问题标题】:Making my recursive code less complicated让我的递归代码不那么复杂
【发布时间】:2015-10-16 20:47:39
【问题描述】:

我正在尝试解决这个问题:http://www.geeksforgeeks.org/print-all-jumping-numbers-smaller-than-or-equal-to-a-given-value/

下面的程序是我想出的,但它不清楚也不干净,人们无法理解。可以修改此解决方案以使其不那么复杂吗?

#include <stdio.h>

int calculate_digits(int x)
{
    if (x <= 9)
        return 1;
    int y = calculate_digits(x/10);
    return y+1;
}

int add_up(int *a, int size, int can_add)
{
    int i, sum=0, mul = 1;

    for (i=0;i<=size;i++) {
        sum = sum*mul + a[i];
        mul = 10;
    }
    return sum*10+can_add;
}

int j;
int output[100];
int foo(int x, int index , int value, int size, int j)
{
    if (x <= 10 || value >= 10)
        return 11;
    if (index >= size) {
        int i;
        for (i=0;i<j;i++)
            printf("%d", output[i]);
        printf("\n");
        printf("next output\n\n");
        return 0;
    }

    if (index == 0) {
        int k;
        for (k=1;k<=9;k++) {
            output[0] = k;
            foo(x, 1, k+1, size, 1);
            foo(x, 1, k-1, size, 1);
        }
    } else if (abs(output[index-1]-value) == 1){
            if (add_up(output, index-1, value) <= x) {
                output[index] = value;
                foo(x, index+1, value+1, size, j+1);
            } else {
                foo(x, index+1, value+1, size, j);
            }
    } else
        foo(x, index+1, value, size, j);
}

int main(void) {
    printf("%d\n", foo(105, 0, 0, calculate_digits(105), 0));
    return 0;
}

我正在寻找更好的递归解决方案,或者如果可能的话,有人可以修改此代码并使其变得更好。

【问题讨论】:

  • 您可以将标题更改为更具体地说明您要简化的递归类型。
  • @AlbertodePaola : 比如?

标签: c algorithm recursion


【解决方案1】:

我想你正在寻找类似的东西:

void jumpingc(int current, int max) {
    if (current <= max) {
        printf("%d ", current);
        int ld = current % 10;
        if (ld > 0)
            jumpingc(current * 10 + ld - 1, max);
        if (ld < 9)
            jumpingc(current * 10 + ld + 1, max);
    }
}

void jumping(int max) {
    printf("%d ", 0);
    for (int i = 1; i <= 9; i++)
        jumpingc(i, max);
}

int main(void) {
    int max = 105;
    jumping(max);
    return 0;
}

【讨论】:

  • 添加第二个 if 语句 (ld ideone.com/RZUTfH
  • 它可以工作。请检查评论中提供的链接。
  • 说得通,现在对我来说说得通
猜你喜欢
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 2015-12-14
  • 2023-03-13
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
相关资源
最近更新 更多