如何将此代码转换为递归函数?基本案例分析

时间:2019-03-14 02:33:21

标签: c

String.charCodeAt()

如何将这段代码转换为递归函数?我在尝试使用此行的“基本案例”时遇到了麻烦

MouseReleased Event

因此,如果我到达一半,我可以打印中间线并返回它,但是它不起作用。此功能会打印由x制成的大X吗?

2 个答案:

答案 0 :(得分:1)

要使用递归解决任务,可以使用以下模式:

  • 解决任务:
    • 检查您是否遇到了小问题。如果是这样的话:
      • 做些小事
    • 否则:
      • 将任务拆分为看起来与整个任务相似的较小部分
      • 通过递归调用函数来解决每个较小的任务

您的任务是print_diagonals(width_of_the_square, current_line_number)

通过给它一个适当的名称并找出参数及其名称来定义此任务是解决此类问题的最重要部分。考虑print_diagonals比考虑recursiveProblem要容易得多,因为我给出的名称具有很多含义并能准确描述其目的。

此任务中的“平凡情况”可以是“在正方形的中间打印线”或“打印正方形的底线”。两者都可以工作,并且程序看起来相似。都尝试它们,然后比较生成的程序。这些程序的共同点是递归程序的典型特征。

使用此信息,您应该可以自己完成家庭作业。

答案 1 :(得分:-1)

我不明白为什么有人要递归。但这有效。

#include <stdio.h>

void recurse(int i, int j, int n){
    printf(i==j || i+j+1==n ? "X" : " ");
    if (++j == n) {
        printf("\n");
        if (++i == n)
            return;
        j=0;
    }
    recurse(i, j, n);
}

int main(){
    int n;
    printf("Enter width: ");
    scanf("%d",&n);
    recurse(0, 0, n);
    return 0;
}

如果您会注意到,我使用if运算符在printf语句内向右移动了一个? :块。

此外,请注意,每个单独的printf都是从其自身的recurse函数调用中调用的,该函数调用位于堆栈上所有其他函数调用的顶部。因此,如果堆栈有限且n很大,则可能会耗尽堆栈并崩溃。这是递归函数应谨慎使用的原因之一。

或者,您可以将递增j的循环放在递归函数中,而仅递归递增i的循环。这样会减少很多堆栈。