如何编写递归打印程序

时间:2012-10-15 06:54:13

标签: c recursion

大师,

我想知道如何编写打印

的递归函数

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个

问题

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

更新

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

8 个答案:

答案 0 :(得分:4)

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

  1. 定义该功能的功能。在这种情况下,它会打印从1到 n 的数字。
  2. 定义递归调用的内容。下一次会发生什么?最简单的方法是自下而上思考;在这种情况下,在每个较早的行上,打印数量最多比前一个少一个。因此,每次再次调用该函数时,您希望使用少于前一个数字的函数调用它。
  3. 定义您的停止条件。我应该何时停止递归?在这种情况下,一旦你达到数字1,这将是你的最后一次迭代。这意味着,我们希望调用递归函数直到达到此停止条件 - 或者换句话说,,而 n大于1。
  4. 因此,我们最终得到以下算法:

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

答案 1 :(得分: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");
}

答案 2 :(得分:0)

我们一直用参数-1调用PrintIt(),直到x&lt; 1.当x <1时,每个呼叫将以相反的顺序返回。 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;
}

答案 3 :(得分: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);
}

答案 4 :(得分: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",

答案 5 :(得分: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);
 }
}

这很简单,对吧?

答案 6 :(得分: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;
    }

答案 7 :(得分:0)

这个问题相当陈旧,但没有一个答案回答实际问题,即。仅使用递归解决C中的问题,没有显式循环。

这是一个简单的解决方案,通过解决原始代码中存在的误解(&#34; print&#34;的两个可能功能之间的混淆)获得。没有明确的循环。

#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);
}