如何在c程序中表达这种数学关系

时间:2015-06-07 16:52:15

标签: c math

如何创建接收int参数n的c代码并返回此数学方程式的值

  

f (n)= 3 * f n - 1)+ 4,其中 f ( 0)= 1

每次程序收到n时,程序应该从0开始到n,这意味着在代码中(for loop)。

这里的问题是我无法将其翻译成代码,我被困在f(n-1)部分,我怎样才能在c中完成这项工作?

请注意。这段代码应该只在基本的C中构建(不再是循环,没有函数,在void main等)。

3 个答案:

答案 0 :(得分:5)

它被称为递归,你有f(0) == 1的基本情况,所以只需检查if (n == 0)并返回1或递归

int f(int n)
 {
    if (n == 0)
        return 1;
    return 3 * f(n - 1) + 4;
 }

迭代解决方案也很简单,例如f(5)

#include <stdio.h>

int
main(void)
 {
    int f;
    int n;

    f = 1;
    for (n = 1 ; n <= 5 ; ++n)
        f = 3 * f + 4;
    printf("%d\n", f);

    return 0;
 }

答案 1 :(得分:1)

LRE(线性递归方程)可以转换为矩阵乘法。在这种情况下:

F(0) =  |  1  |   (the current LRE value)
        |  1  |   (this is just copied, used for the + 4)

M =     | 3 4 |   (calculates LRE             to new 1st number)
        | 0 1 |   (copies previous 2nd number to new 2nd number (the 1))

F(n) = M F(n-1) = matrixpower(M, n) F(0)

您可以使用重复平方(有时称为二进制求幂)将矩阵提升到幂n。整数的示例代码:

    r = 1;             /* result */
    s = m;             /* s = squares of integer m */
    while(n){          /* while exponent != 0 */
        if(n&1)        /*   if bit of exponent set */
            r *= s;    /*     multiply by s */
        s *= s;        /*   s = s squared */
        n >>= 1;       /*   test next exponent bit */
    }

对于无符号的64位整数,n的最大值是40,因此最大循环数将是6,因为2 ^ 6> 1。 40。

如果这个表达式计算f(n)= 3 f(n-1)+ 4对一个非常大的n模拟一些素数(如1,000,000,007),那么矩阵方法将是有用的,但在这种情况下, n = 40的最大值,递归或迭代足够好且更简单。

答案 2 :(得分:-1)

最好是使用递归。在线学习。

它是解决问题的非常有效的方法。经典的是计算阶乘。它广泛用于许多算法,如树/图遍历等。

计算机科学中的递归是一种解决问题的方法取决于同一问题的较小实例的解决方案。

在这里,您可以将大小n的问题分解为3个大小为n-1的子问题实例+每个此类步骤中的常量大小问题。

递归将在基本情况下停止,即这里的平凡情况为n = 0函数或最小子问题的值为1.