사용자의 입력을 다음과 같이 생각해보자 9
. 따라서 9까지의 피보나치 수열은 다음과 같습니다. 0,1,1,2,3,5,8,13,21
예상 출력: 0,*,1,*,3,*,8,*,21
다음은 논리를 구현하는 데 사용한 코드입니다.
UserInput=9
a=0
b=1
echo "The Fibonacci series is : "
for (( i=0; i<UserInput; i++ ))
do
if [ $i -eq 2 ]
then
echo -n "$a "
sn=$((a + b))
a=$b
b=$sn
fi
done
답변1
힘 기반 awk
솔루션(단순화를 위해 가정함 n>2
):
awk -v n=9 'BEGIN{q=1; printf "0,*,"; for (i=2;i<n;i++) {s=q+r;r=q;q=s; printf "%s%s",i%2?"*":s,i==n-1?"\n":","}}'
사용자 입력은 변수에 저장되고 n
명령줄 매개변수를 통해 전달됩니다.awk
-v n=number
다음과 같은 경우 즉시 종료하려면 n<3
:
awk -v n=9 'BEGIN{if (n<3) exit; q=1; printf "0,*,"; for (i=2;i<n;i++) {s=q+r;r=q;q=s; printf "%s%s",i%2?"*":s,i==n-1?"\n":","}}'
설명하다
awk
는 텍스트 처리 도구이며 우리는 이를 "창의적으로 남용"하고 있습니다. 따라서 모든 것은 BEGIN
일반적으로 첫 번째 입력 파일이 처리되기 전에 실행되는 코드를 포함하는 블록 내에서 발생합니다.
구문 자체는 C와 매우 유사하므로
- 계열의 처음 두 항을 인쇄합니다(가정 때문에 고정되어 있습니다
n>2
).printf "0,*,"
- 루프에서
2
처음 두 합계의 합으로n-1
피보나치 수를 계산하고 합계 를 업데이트합니다 .s
q
r
q
r
*
짝수이면 인쇄하고, 짝수가 아니면i
현재 피보나치 수열을 인쇄합니다( ).s
i%2?"*":s
,
그런 다음 루프의 끝에 도달했는지 여부에 따라 a 또는 개행 문자를 인쇄합니다 (i==n-1
).
답변2
Bash 및 산술 연산자를 사용하는 가장 가까운 코드는 다음과 같습니다.
#!/bin/bash
let UserInput=9
let a=0
let b=1
echo -n "The Fibonacci series is: 0"
for (( i=1; i<UserInput; i++ )) ; do
let sn=a+b
let a=b
let b=sn
if (( i % 2 == 0 )) ; then
echo -n ",$a"
else
echo -n ",*"
fi
done
echo
if
명령문 에서는 %
모듈로(나머지) 연산자를 사용해야 합니다. 이를 사용하면 i
2로 나눌 수 있는지(예: 짝수) 테스트 하고 그에 따라 값을 인쇄 $a
하거나 *
.
출력은 다음과 같습니다:
The Fibonacci series is: 0,*,1,*,3,*,8,*,21
자체적으로 단계 수를 가져오도록 스크립트를 변경하세요.토론, 스크립트의 첫 번째 줄을 다음과 같이 수정하세요.
let UserInput="$1"