【问题标题】:Is it possible to calculate Fibonacci sequence by preprocessor directives in C?是否可以通过 C 中的预处理器指令计算斐波那契数列?
【发布时间】:2021-07-11 09:35:45
【问题描述】:

仅供个人学习和更好地理解C代码预处理器????:

我想知道是否可以通过预处理器指令在C语言中实现斐波那契函数。

斐波那契函数的正常定义可以是:

int f(int i) {  // i should be non-negative integer
    if (i <= 1) {
        return 1;
    }
    return f(i - 1) + f(i - 2);
}

在 C++ 中使用模板元编程技术的方法不是我需要的。


使用代码预处理器似乎无法进行递归计算?

【问题讨论】:

  • 为什么要用宏来做?
  • 一个 64 位整数最多可以存储第 94 项。
  • 一般建议。可以使用函数时不要使用宏。
  • @klutt:OP 并没有说他们想用宏来实现斐波那契函数。他们问这是否可能,这仅表明他们想知道,而不是他们想这样做。通常,了解各种工具的功能有助于了解它们、了解更多信息、激发创造力以及了解未来情况下可用的内容。他们询问是否可以使用预处理器指令,而不是仅使用宏。
  • @EricPostpischil 我完全同意。但是,在 OP 编辑​​之前,问题看起来完全不同。

标签: c macros fibonacci


【解决方案1】:

我不认为 C 中的宏可以支持递归宏。但斐波那契是可能的宏。 通过使用第n个数的公式

#define Fibonacci(n) (POW(1+POW(5,1/2),n) - POW(1-POW(5,1/2),n))/POW(5,1/2)

【讨论】:

  • 好吧,您需要定义POW,并注意1/2 不会被评估为0
  • @Ian Abbott 我同意,但这只是一个想法
  • 我认为这是一个直接且非常好的方法。但实际上,我正在学习 C 预处理器并想知道是否存在递归解决方案来在运行之前获取一些斐波那契数列。谢谢你的回答~@Silver
【解决方案2】:

C 或 C++ 中不允许使用递归宏。

宏——只是一个文本替换,而不是计算

【讨论】:

  • 使用代码预处理器好像不能进行递归计算?
  • 在某种程度上可以在 C 中使用递归宏。见stackoverflow.com/a/12540675/4989451
  • (a) 使用宏替换不可能进行无限递归,但有限的实际递归可以。 (b) 宏替代预处理器标记,而不是文本。它们还可以字符串化和连接。 (c) 该问题询问使用预处理器指令来评估斐波那契函数,而不仅仅是使用宏替换。所以答案必须考虑使用其他指令的可能性,例如#include,它可以是递归的。
  • (我看到 OP 编辑​​了他们的问题;它最初只询问宏。所以在写这个答案时(c)不是问题。)
  • 最后可以通过C语言的预处理指令实现斐波那契函数(递归包含和预处理后相当大的文件)。
【解决方案3】:

使用 boost 预处理器的插槽和迭代解决方案,以宏 I 作为输入:

#ifndef INITIALIZE
#define INITIALIZE
# include <boost/preprocessor/slot.hpp>
# if I<=2
1
# else
#  define BOOST_PP_VALUE 2
#  include BOOST_PP_ASSIGN_SLOT(1)
#  define BOOST_PP_VALUE 1
#  include BOOST_PP_ASSIGN_SLOT(3)
#  define BOOST_PP_VALUE 1
#  include BOOST_PP_ASSIGN_SLOT(4)
#  include __FILE__
# endif
#else
#  define BOOST_PP_VALUE BOOST_PP_SLOT(1) + 1
#  include BOOST_PP_ASSIGN_SLOT(1)
#  define BOOST_PP_VALUE BOOST_PP_SLOT(3)
#  include BOOST_PP_ASSIGN_SLOT(2)
#  define BOOST_PP_VALUE BOOST_PP_SLOT(4)
#  include BOOST_PP_ASSIGN_SLOT(3)
#  define BOOST_PP_VALUE BOOST_PP_SLOT(2) + BOOST_PP_SLOT(3)
#  include BOOST_PP_ASSIGN_SLOT(4)
# if I==BOOST_PP_SLOT(1)
BOOST_PP_SLOT(4)
# else
#  include __FILE__
# endif
#endif

演示:http://coliru.stacked-crooked.com/a/c399d11dedc306ca

【讨论】:

    猜你喜欢
    • 2020-01-18
    • 1970-01-01
    • 2017-07-22
    • 2017-11-18
    • 2012-12-03
    • 2013-03-31
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    相关资源
    最近更新 更多