【问题标题】:how to print numbers from 1 to N using recursive function in C [closed]如何使用C中的递归函数打印从1到N的数字[关闭]
【发布时间】:2018-08-18 01:25:01
【问题描述】:

我正在使用函数在 C 中打印从 1 到 N 的数字。但问题是,变量必须在内部定义,不应该使用循环。函数是按名称调用的。简而言之,函数每次调用时都应该打印一个数字。我无法对程序进行编码,因为变量是在函数内部声明的。请告诉我是否可以这样做。

例如:打印从 1 到 5 的数字。但它只打印 '1' 5 次。

#include <stdio.h>
void main()
{
repeat_function();
repeat_function();
repeat_function();
repeat_function();
repeat_function();
return 0;
}

void repeat_function()
{
int a=1;
printf (%d,a);
a = a + 1;
}

【问题讨论】:

  • 内部定义是什么意思?
  • 通过引用传递变量。所以变量的作用域在不同的函数中。
  • @ClamentJohn C 中没有通过引用传递。
  • @ClamentJohn “编写可扩展的代码。期间。”完全错误。
  • 你读过@ClamentJohn 的答案了吗?传递 4 或 8 个字节并没有太大的区别。最重要的是,在 64 位机器上传递单个 int 会复制 4 个字节,而传递指针将复制 8 个字节,因此在这种特殊情况下传递 int 甚至会稍微快一点

标签: c


【解决方案1】:

你可以像这样使用静态变量:

static int i = 1;

静态变量只声明一次。

你也可以声明全局变量全局变量只是在函数外部声明的变量。这些函数可以在每个 sub_scope 中使用。

或者你可以这样做:

#include <stdio.h>

int ft_loop(int i, int limit) {
    printf("i = %d", i);
    if (i > limit)
        return 0;
    ft_loop(i++, limit);
}

int main()
{
    ft_loop(1, 30);

    return 0;
}

【讨论】:

  • 这会增加你的堆栈大小。您在每个函数调用中声明 num 。记住它是递归调用的。
  • 什么意思?
  • 当您每次调用ft_loop 时,您都在新范围内声明了两个新的int。这意味着程序要求更多内存。你的这段代码可以工作,但你不像 C 程序员那样思考,内存是everything
  • @ClamentJohn 如果内存就是一切,那么在汇编中编写代码。
  • 好的,我明白了。但你错了。我没有声明两个新的 int。我只是每次都看同一个记忆区。
【解决方案2】:
void printMe(int num) {
    if (num == N+1) { return; }
    printf("%d", num);
    printMe(num+1);
}

【讨论】:

  • 这将打印从 N 到 1 的数字,而不是从 1 到 N ;)
  • 这会增加你的堆栈大小。您在每个函数调用中声明 num 。记住它是递归调用的。
  • 更改printf 调用和printMe 调用的顺序以获得正确的输出顺序。
  • @ClamentJohn 任何递归范式都会使堆栈爆炸。
  • 谢谢,但我不能将任何值传递给函数......甚至(int num)。
【解决方案3】:

最简单的方法是将数字作为参数的函数。 如果参数大于 1,则此函数会使用parameter - 1 调用自身。最后,它会打印参数的值并返回。

编辑 由于您不需要传递参数或使用静态变量,因此您可以使用全局变量。

#include <stdio.h>

int value = 10;

void recursion() {
    if (value > 0) {
        int out = value;
        value--;
        recursion();
        printf("%d", out);
    }
    return;
}

int main()
{
    recursion();
    return 0;
}

这不是很好的风格,但它可以满足您的要求。

EDIT2

使用您的代码示例,我使用全局变量来解决此问题:

#include <stdio.h>

int value = 1; // <-- global variable

void main()
{
repeat_function();
repeat_function();
repeat_function();
repeat_function();
repeat_function();
return 0;
}

void repeat_function()
{
printf (%d,value);
value += 1;
}

【讨论】:

  • 感谢您的回答,但我不允许将任何变量传递给函数。
  • 谢谢,但仍然 'Edit2' 它不能工作,因为给我的条件不允许使用全局变量。
  • 那么我知道没有一个简单的解决方案。你应该阅读变量的范围。在函数内部创建的变量将在函数返回后立即销毁。这与您的问题下面讨论的堆栈帧问题有关。函数的局部变量存储在其堆栈帧中,该堆栈帧在函数返回后被清除。将文件用作临时内存是一种选择吗?
猜你喜欢
  • 2021-12-09
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2023-02-18
相关资源
最近更新 更多