-4

大师们,

我想知道如何编写一个打印的递归函数

1
12
123
1234
...
......

例如: display(4) 应该打印

1
12
123
1234

代码

#include <stdio.h>

void print(int n)
{
        if(n != 0)
        {
                print(n-1);
                printf("\n");
                print(n-1);
                printf("%d",n);
        }
}
int main()
{
        print(3);
}

输出
1

12

1

123

问题

我想编写一个纯递归 (没有任何循环)函数,但无法过滤不需要的打印。希望有人能帮帮我!!!

更新

谢谢大家的回答。从给出的所有评论看来,我们似乎可以只用递归编写一个,并且需要一个循环。

4

8 回答 8

4

要定义递归函数,您必须做三件事:

  1. 定义函数的作用。在这种情况下,它打印从 1 到n的数字。
  2. 定义递归调用是什么。下一次会发生什么?最简单的方法是自下而上地思考;在这种情况下,在前面的每一行上,它打印的数字最多比前一行少一个。因此,每次再次调用该函数时,都希望以比前一个数字小一的方式调用它。
  3. 定义您的停止条件。我应该什么时候停止递归?在这种情况下,一旦你达到数字 1,这将是你的最后一次迭代。这意味着,我们想要调用递归函数,直到达到这个停止条件——或者换句话说,n 大于 1 时。

因此,我们最终得到以下算法:

function display(n):
    if(n > 1):
        display(n-1);

    print 1..n;
于 2012-10-15T07:00:00.840 回答
1

编辑:好的,我根据@lc 的指导改进了我的答案。

void print_recursive(unsigned int num) {
    if (num > 1) {
        print_recursive(num - 1);
    }
    for (unsigned int i = 0; i < num; i++) {
        printf("%d ", (i + 1));
    }
    printf("\n");
}
于 2012-10-15T06:59:34.740 回答
1

这个问题已经很老了,但没有一个答案能回答实际问题,即。仅使用递归解决 C 中的问题,无需显式循环。

这是通过修复原始代码中存在的误解(“打印”的两个可能功能之间的混淆)而获得的简单解决方案。没有显式循环。

#include <stdio.h>

void countto(int n)
{
        if(n != 0)
        {
        countto(n-1);
        printf("%d",n);
        }
}

void triang(int n)
{
        if(n != 0)
        {
                triang(n-1);
                printf("\n");
                countto(n);
        }
}

int main()
{
        triang(4);
}
于 2018-01-23T00:18:42.847 回答
0

我们继续使用参数 1 递归调用 PrintIt(),直到 x < 1。然后,当 x < 1 时,每个调用都将以相反的顺序返回。在每次返回时,我们打印从 1 到 x 的行。

#include "stdio.h"

void PrintIt( int x )
{
    int i;
    if( x > 1 )
    {
        PrintIt( x - 1 );
        printf("\n");
    }

    for( i = 1; i < x+1; i++)
    {
        printf("%d", i);
    }

    return;
}

int main(int argc, char *argv[])
{
    PrintIt( 4 );
    return 0;
}
于 2012-10-15T07:22:42.543 回答
0

这里使用的递归函数是func(int)。最初,该值是从 main() 程序传递的。递归一直发生,直到我们达到退出条件,在这种情况下为 val=0。一旦我们达到那个水平,我们将倒数第二帧移动一个打印“1”。遵循相同的模式以获得序列“1 2”。. . “1 2 3”。. . “1 2 3 4”

int func(int val){

        int temp,i;

        if( val == 0 )
        {
                val++;
                return val;
        }
        else
        {
                val--;
                temp=func( val );

                for (i=1;i<=temp;i++)
                {
                        printf("%d",i);
                }
                printf("\n");

                temp++;
                return temp;
        }
}

int main(){

        int value=4, result;

        result=func(value);
}
于 2012-10-15T07:27:39.380 回答
0

只是为了好玩,这是一个纯粹的递归解决方案。它在 python 中,无论如何它实际上是伪代码。(为了清楚起见,非pythonic换行符)。

def loop(max, row=1, col=1):
    if col <= row:
        print col,
        loop(max, row, col+1)
    elif row < max:
        print "\n",
        loop(max, row+1, 1)
    else:
        print "\n",
于 2013-11-29T22:48:11.640 回答
0
#include<stdio.h>
void print_num(int x);
int n;
void main(){
printf("Enter number of lines: ");
scanf("%d",&n);
print_num(1);
}
void print_num(int x){
int i;
for(i=1;i<=x;i++){
printf("%d",i);
 }
if(x<n){
printf("\n");
x++;
print_num(x);
 }
}

这很简单,对吧?

于 2014-03-21T10:26:16.010 回答
0
void display(int k)
    {
         if (k < 1) { return; }
         display(k-1);
         for (int i = 1; i <= k; i++)
         {
         cout << i;
         }
         cout << endl;

    }


    int main()
    {
        int a = 4;
        display(a);
        return 0;
    }
于 2017-08-29T15:45:14.810 回答