110,501
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static int c1 = 0;
static int c2 = 0;
public static int FibonacciRecursively(int n)
{
c1++;
if (n < 2) return n;
return FibonacciRecursively(n - 1) + FibonacciRecursively(n - 2);
}
public static int FibonacciTailRecursively(int n, int acc1, int acc2)
{
c2++;
if (n == 0) return acc1;
return FibonacciTailRecursively(n - 1, acc2, acc1 + acc2);
}
static void Main(string[] args)
{
FibonacciRecursively(10);
FibonacciTailRecursively(10, 0, 1);
Console.WriteLine(c1);
Console.WriteLine(c2);
}
}
}
public static int FibonacciTailRecursively(int n, int acc1, int acc2)
{
while (!(n == 0))
{
c2++;
n = n - 1;
int acc1_old = acc1;
acc1 = acc2;
acc2 = acc1_old + acc2;
}
c2++;
return acc1;
}
public static int FibonacciTailRecursively(int n)
{
int acc1 = 0;
int acc2 = 1;
while (n != 0)
{
acc2 = acc1 + acc2;
acc1 = acc2 - acc1;
n--;
}
return acc1;
}
public static int FibonacciTailRecursively(int n)
{
int a = 0;
int b = 1;
for (int i = n; i != 0; i--)
{
b = a + b;
a = b - a;
}
return a;
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static int Max(int[] source)
{
int max = source[0];
for (int i = 1; i < source.Length; i++)
{
if (max < source[i]) max = source[i];
}
return max;
}
static void Main(string[] args)
{
int[] a = { 1, 4, 5, 9, 2, 0, 2, 3, 8, 5, 12, 7, 4, 6 };
Console.WriteLine(Max(a));
}
}
}
static int Max(int[] source, int max)
{
for (int i = 1; i < source.Length; i++)
{
if (max < source[i]) max = source[i];
}
return max;
}
static int Max(int[] source, int max)
{
int i = 1;
while (i < source.Length)
{
if (max < source[i]) max = source[i];
i++;
}
return max;
}
static int Max(int[] source, int max, int i)
{
if (i < source.Length)
{
if (max < source[i]) max = source[i];
i++;
return Max(source, max, i);
}
else
{
return max;
}
}
static int Max(int[] source, int max, int i)
{
if (i >= source.Length) return max;
if (max < source[i]) max = source[i];
i++;
return Max(source, max, i);
}
static int Max(int[] source)
{
int max = source[0];
for (int i = 1; i < source.Length; i++)
{
if (max < source[i]) max = source[i];
}
Console.WriteLine("Hello World");
return max;
}
static int Max(int[] source, int max, int i)
{
if (i >= source.Length)
{
Console.WriteLine("Hello World");
return max;
}
if (max < source[i]) max = source[i];
i++;
return Max(source, max, i);
}
public static int FibonacciRecursively(int n)
{
if (n < 2) return n;
return FibonacciRecursively(n - 1) + FibonacciRecursively(n - 2);
}
public static int FibonacciTailRecursively(int n, int acc1, int acc2)
{
c2++;
if (n == 0) return acc1;
return FibonacciTailRecursively(n - 1, acc2, acc1 + acc2);
}
为了计算出N的裴波那切数,必须先计算出N-1和N-2的裴波那契数,然而从上面代码的参数分配上,完全无法理解acc1和acc2与n的关系,acc1原意是想说的N-1的值,acc2是N-2的值,从调用中FibonacciTailRecursively(10,0,1)来看,acc1和acc2的参数使人无法理解。这段代码的理解是:为了求Fib(N),必须先求fib(0)和fib(1),因为参数传递的就是fib(0)和fib(1)的值,然后再求fib(1)和fib(2),最后求fib(N-1)和fib(N-2),这里根本就是把一个for循环的变量强行放置到函数参数的位置上而已,n的值就是个循环控制变量。
static int Max(int[] source, int max, int i)
{
if (i >= source.Length) return max;
if (max < source[i]) max = source[i];
i++;
return Max(source, max, i);
}
上面这段代码依然使人无法理解,很显然这里应该这么调用Max函数,Max(source,0,0);这里应该是这么理解这段代码的:为了求出source[N]的最大值,不得不先求出source[0-0]的最大值,然后再求出source[0-1]的最大值,然后再求出source[0-2]的最大值,最后才求出source[0-N]的最大值。以及函数参数max的意图是为了存储一个变量。
可以说,这样的代码不是一个严格的递归调用,只是强行使用递归而凑的一个循环而已。
假设递归求取多重指针的值,char ********p的值,********p这个该怎么求取。
这样的求法是,为了求N重指针的值,必须先求出N-1重指针的值*(*******p),这里的递归其本质就是一个自右向左结合的一个表达式,递归的本质是倒退求解问题的,把递归使用成正向前进的一个循环是说不通的。